5

「連絡先DBに変更があった」という一般的な通知を受け取ることができますが、挿入、更新、または削除された特定のレコードを知りたいです。

すべての連絡先にルックアップ URI を個別に設定したくないので、ルックアップ URI の概念を使用したくありません。連絡先がいつ更新または削除されたかを知ることができる一般的なソリューションが必要です。

4

2 に答える 2

10

Serviceデータベースのステータスを監視するを実装できます。

import android.app.Service;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
import android.os.IBinder;
import android.provider.ContactsContract;

public class ContactService extends Service {

private int mContactCount;

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    mContactCount = getContactCount();
    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) {
            // DELETE HAPPEN.
        } else if (currentCount == mContactCount) {
            // UPDATE HAPPEN.
        } else {
            // INSERT HAPPEN.
        }
                    mContactCount = currentCount;
    }

};

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    getContentResolver().unregisterContentObserver(mObserver);
 }

}
于 2012-05-03T13:19:26.673 に答える
1

この問題を次の方法で実装しました。

アプリのインストール中に、ローカル DB の連絡先テーブルが特定の時間の連絡先によって初期化されています。次に、すべての通話が CallListner によって追跡されます。ユーザーが電話をかけたり発信したりした場合、その番号がユーザーの現在の電話帳にあるかどうかを確認し、そうであれば、その番号に関連するすべての連絡先情報を取得し、ローカル DB を更新します。

于 2014-05-09T20:12:35.300 に答える