【问题标题】:Errors with ContentObserver for Contacts联系人的 ContentObserver 错误
【发布时间】:2012-02-29 16:20:55
【问题描述】:

我是一名初学者,我正在开发一个应用程序,我希望在添加新联系人时收到通知。 我尝试了以下代码,但出现了如下 Logcat 跟踪中的错误。

我还有一个疑问是,一旦我从我的应用程序注册了我的 ContentObserver,即使用户退出我的应用程序,它是否会收到通知,或者我应该在服务中编写它并在后台运行它。 请帮忙

public class B extends ContentObserver {
Context ctx;
String ContactId,DisplayName;
final String[] projection = new String[] { ContactsContract.Contacts._ID};
Cursor curval,people;
private static final String TAG = "NewContactTrackService";
@Override
public boolean deliverSelfNotifications() {
// TODO Auto-generated method stub
Log.e(TAG, "Self notification called");
return true;

}

@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
//super.onChange(selfChange);
Log.e(TAG, "Onchange Called");
people = ctx.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while(people.moveToNext())
{
// values.clear();

ContactId = people.getString(people.getColumnIndex(ContactsContract.Contacts._ID));
DisplayName = people.getString(people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Log.e(TAG, "New Contact with contact id "+ContactId);
Log.e(TAG, "New Contact Displayname "+DisplayName);
}
}

public B(Handler handler) {
super(handler);
Log.e(TAG, "Handler Called");
// TODO Auto-generated constructor stub
}
public void register(Context ctx)
{
Log.e(TAG, "Registering");
this.ctx=ctx;
curval = ctx.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, null);
curval.registerContentObserver(new B(new Handler()));
Log.e(TAG, "Registered");
}
} 

这是我创建上述类对象的示例活动

public class TrackContactActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
B obj=new B(new Handler());
obj.register(getApplicationContext());
}
} 

Logcat 跟踪:

02-29 20:59:59.571: ERROR/AndroidRuntime(324): ERROR: thread attach failed
02-29 20:59:59.951: ERROR/NewContactTrackService(330): Handler Called
02-29 20:59:59.951: ERROR/NewContactTrackService(330): Registering
02-29 21:00:00.050: ERROR/NewContactTrackService(330): Handler Called
02-29 21:00:00.050: ERROR/NewContactTrackService(330): Registered
02-29 21:01:35.270: ERROR/NewContactTrackService(330): Onchange Called
02-29 21:01:35.281: ERROR/AndroidRuntime(330): Uncaught handler: thread main exiting due to uncaught exception
02-29 21:01:35.281: ERROR/AndroidRuntime(330): java.lang.NullPointerException
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at com.sample.B.onChange(B.java:29)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:43)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.os.Handler.handleCallback(Handler.java:587)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.os.Handler.dispatchMessage(Handler.java:92)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.os.Looper.loop(Looper.java:123)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at java.lang.reflect.Method.invokeNative(Native Method)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at java.lang.reflect.Method.invoke(Method.java:521)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-29 21:01:35.281: ERROR/AndroidRuntime(330): at dalvik.system.NativeStart.main(Native Method)
02-29 21:01:35.361: ERROR/dalvikvm(330): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
02-29 21:01:38.641: ERROR/gralloc(65): [unregister] handle 0x3236c0 still locked (state=40000001)

【问题讨论】:

  • B.java 类的第 29 行到底写了什么。
  • @AnkitAwasthi people = ctx.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

标签: android broadcastreceiver contentobserver


【解决方案1】:

尝试更改以下行

 Context ctx;

与

 static Context ctx;

它会起作用的。

更好的解决方案是尝试在 register 方法中传递应用程序上下文。

【讨论】:

  • 不建议保持对上下文的静态引用
  • @PeterChaula 是的,不推荐。尝试在每次需要时从 UI 元素中传递它。
猜你喜欢
  • 2012-01-17
  • 2012-08-27
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多