web-dev-qa-db-ja.com

アドレス帳に挿入/更新/削除された連絡先を聞く方法

それに関連する質問はたくさんありますが、どれも私が解決策を得るのに役立ちません。

デバイスからリモートサーバーにすべての連絡先を同期しようとしていますが、簡単に同期できますが、更新/削除/挿入(新しい連絡先)などの連絡先に変更があると、解決策が見つかりません。

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()が複数回呼び出されます。

誰かが私にそれに対するより良い解決策を提供できますか?

よろしくお願いします。

ありがとう

18
moDev

onChangeについては、削除/追加/更新の両方で呼び出されるため、連絡先が削除され、追加された場合は連絡先帳が変更されている可能性があるため、連絡先の数を数えることはできません。同じカウント。ただし、バージョンを見ると、どの連絡先が更新されているかを評価できるはずです(連絡先を取得した後)連絡帳の完全なコピーはすでに)。バージョンが(現在の連絡先の)既存のものよりも大きいかどうかを確認するだけです。

18
Magnus

Magnusの回答に従って、この列を使用してバージョンコードを取得します

ContactsContract.RawContacts.VERSION

1
Codelicious