それに関連する質問はたくさんありますが、どれも私が解決策を得るのに役立ちません。
デバイスからリモートサーバーにすべての連絡先を同期しようとしていますが、簡単に同期できますが、更新/削除/挿入(新しい連絡先)などの連絡先に変更があると、解決策が見つかりません。
ContentObserver
を使用してみましたが、onChange()
が複数回呼び出されています。連絡先の変更データを見つけるのは困難です。
_ public class ContactService extends Service {
private int mContactCount;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mContactCount = getContactCount();
Log.d("Contact Service", mContactCount + "");
this.getContentResolver().registerContentObserver(
ContactsContract.Contacts.CONTENT_URI, true, mObserver);
}
private int getContactCount() {
Cursor cursor = null;
try {
cursor = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null,
null);
if (cursor != null) {
return cursor.getCount();
} else {
return 0;
}
} catch (Exception ignore) {
} finally {
if (cursor != null) {
cursor.close();
}
}
return 0;
}
private ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
final int currentCount = getContactCount();
if (currentCount < mContactCount) {
// CONTACT DELETED.
Log.d("Contact Service", currentCount + "");
} else if (currentCount == mContactCount) {
// CONTACT UPDATED.
og.d("Contact Service", currentCount+"");
} else {
// NEW CONTACT.
Log.d("Contact Service", currentCount + "");
}
mContactCount = currentCount;
}
};
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(mObserver);
}
}
_
ただし、アドレス帳に更新/挿入があると、onChange()
が複数回呼び出されます。
誰かが私にそれに対するより良い解決策を提供できますか?
よろしくお願いします。
ありがとう
onChange
については、削除/追加/更新の両方で呼び出されるため、連絡先が削除され、追加された場合は連絡先帳が変更されている可能性があるため、連絡先の数を数えることはできません。同じカウント。ただし、バージョン列を見ると、どの連絡先が更新されているかを評価できるはずです(連絡先を取得した後)連絡帳の完全なコピーはすでに)。バージョンが(現在の連絡先の)既存のものよりも大きいかどうかを確認するだけです。
Magnusの回答に従って、この列を使用してバージョンコードを取得します
ContactsContract.RawContacts.VERSION