我正在开发一个 Android 应用程序。在这个应用程序中,我必须将联系人与“Android 联系人”同步。
我读了一些关于这个主题的复杂文章。例如:
http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/
这是同步联系人的一个很好的例子,但我不认为为此创建一个新帐户。所以决定手动同步联系人并再次搜索。我找到了 ContentObserver。
我的问题是:
public class DenemeObserverActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("MyTag", "OnCreate---");
//this.getApplicationContext().getContentResolver().registerContentObserver (ContactsContract.Contacts.CONTENT_URI, true, contentObserver);
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
cursor.setNotificationUri(this.getApplicationContext().getContentResolver(), ContactsContract.Contacts.CONTENT_URI);
this.getApplicationContext().getContentResolver().notifyChange(ContactsContract.Contacts.CONTENT_URI, null);
cursor.registerContentObserver(contentObserver);
}
private class MyContentObserver extends ContentObserver {
public MyContentObserver() {
super(null);
}
@Override
public boolean deliverSelfNotifications() {
Log.d("MyTag", "DeliverSelfNotifications---");
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.d("MyTag", "onChanges---");
}
}
MyContentObserver contentObserver = new MyContentObserver();
在这段代码中,如果我删除这些行:
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
cursor.setNotificationUri(this.getApplicationContext().getContentResolver(), ContactsContract.Contacts.CONTENT_URI);
this.getApplicationContext().getContentResolver().notifyChange(ContactsContract.Contacts.CONTENT_URI, null);
cursor.registerContentObserver(contentObserver);
并取消标记: //this.getApplicationContext().getContentResolver().registerContentObserver (ContactsContract.Contacts.CONTENT_URI, true, contentObserver);
我可以处理更改联系人更改。但 Android 只是调用 onChange 方法。
如果在联系人更改时尝试使用此代码(带光标),我看不到对 onChange() 的任何调用。
如何处理“更改了哪一行?”。
或者
我可以在没有新帐户的情况下使用 AbstractThreadedSyncAdapter 同步联系人吗?如果可以,如何?