Android 如何知道已删除/更新/添加的联系人以及新添加的联系人

Android 如何知道已删除/更新/添加的联系人以及新添加的联系人,android,Android,我正在使用内容观察者来了解设备的联系人电话簿发生了更改,但我没有完成确切的任务,例如联系人是否已添加、删除或更新,以及修改后的联系人的价值是什么 // Service running in background which always run and check to know that content has been changed public class ContactChange extends Service { ContactObserver observer;

我正在使用内容观察者来了解设备的联系人电话簿发生了更改,但我没有完成确切的任务,例如联系人是否已添加、删除或更新,以及修改后的联系人的价值是什么

// Service running in background which always run and check to know that content has been changed


public class ContactChange extends Service {


    ContactObserver observer;

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

    @Override
    public void onCreate() {
        observer = new ContactObserver(new Handler(),getApplicationContext());
        // TODO Auto-generated method stub
        getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, false, observer);

        super.onCreate();
    }

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



//Content observer where we get to know that changes has made to the contact phonebook

    public class ContactObserver extends ContentObserver {

    private Context mContext;
    DataBaseCurdOperation dataBaseCurdOperation;
    ApiInterface apiInterface;
    MyPrefs myPrefs;
    ArrayList<InviteList> inviteArrayList;

    public ContactObserver(Handler handler, Context context) {
        super(handler);
        this.mContext = context;
        dataBaseCurdOperation = new DataBaseCurdOperation(mContext);
        myPrefs = new MyPrefs(mContext);
        apiInterface = ServiceGenerator.createService(ApiInterface.class, Config.BASE_URL_1);
        inviteArrayList = new ArrayList<InviteList>();
    }

    @Override
    public void onChange(boolean selfChange) {
        this.onChange(selfChange, null);
    }




    @Override
    public void onChange(boolean selfChange, Uri uri) {
        Logger.LogError("URI", uri.toString());
        boolean hasContactPermission = (ContextCompat.checkSelfPermission(mContext,
                android.Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED);
        if (hasContactPermission) {
            SavingContactsActivity savingContactsActivity = new SavingContactsActivity(mContext);
            savingContactsActivity.execute();
            new InviteApiCall().execute();
        }
    }
//在后台运行的服务,始终运行并检查内容是否已更改
公共类ContactChange扩展了服务{
接触观察者;
@可空
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
observer=newcontactobserver(newhandler(),getApplicationContext());
//TODO自动生成的方法存根
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI,false,observer);
super.onCreate();
}
@凌驾
公共空间{
super.ondestory();
getContentResolver()。取消注册ContentObserver(observer);
}
}
//内容观察者,我们可以从中了解联系人电话簿的更改
公共类ContactObserver扩展了ContentObserver{
私有上下文;
数据库操作数据库操作;
api接口api接口;
MyPrefs MyPrefs;
ArrayList邀请ArrayList;
公共ContactObserver(处理程序,上下文){
超级(处理器);
this.mContext=上下文;
dataBaseCurdOperation=新的dataBaseCurdOperation(mContext);
myPrefs=新的myPrefs(mContext);
apiInterface=ServiceGenerator.createService(apiInterface.class,Config.BASE\u URL\u 1);
inviteArrayList=新建ArrayList();
}
@凌驾
公共void onChange(布尔自更改){
this.onChange(selfChange,null);
}
@凌驾
public void onChange(布尔自更改,Uri){
Logger.LogError(“URI”,URI.toString());
布尔值hasContactPermission=(ContextCompat.checkSelfPermission(mContext,
android.Manifest.permission.READ_CONTACTS)==PackageManager.permission_grated);
if(hasContactPermission){
SavingContactsActivity SavingContactsActivity=新的SavingContactsActivity(mContext);
savingContactsActivity.execute();
new InviteApiCall().execute();
}
}

采用这种方法,无论是添加还是更新,它都会给联系人提供删除的解决方案,但肯定会很快发布删除的答案。。。。 在那之后我就开始做数据库了

public class ContactSyncObserver extends ContentObserver {

Context mContext;
DataBaseCurdOperation dataBaseCurdOperation;
MyPrefs myPrefs;


public ContactSyncObserver(Handler handler, Context mContext) {
    super(handler);
    this.mContext = mContext;
    dataBaseCurdOperation = new DataBaseCurdOperation(mContext);
    myPrefs = new MyPrefs(mContext);

}

@Override
public boolean deliverSelfNotifications() {
    return true;
}

@Override
public void onChange(boolean selfChange, Uri uri) {
    super.onChange(selfChange, uri);
    boolean hasContactPermission = (ContextCompat.checkSelfPermission(mContext,
            Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED);
    if (hasContactPermission) {
        try {
            Cursor cursor = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP + " Desc");
            if (cursor.moveToNext()) {
                String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                Logger.LogError("contactId", myPrefs.getContactId());
                String name = cursor.getString(
                        cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String rawContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.NAME_RAW_CONTACT_ID));
                String phoneNumber = null;
                String hasPhoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (Integer.parseInt(hasPhoneNumber) > 0) {
                    Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null);
                    while (phones.moveToNext()) {
                        phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        Log.e("Number", phoneNumber);
                    }
                    phones.close();
                }
                if (phoneNumber != null) {
                    phoneNumber = phoneNumber.replaceAll(" ", "");
                }
                if (dataBaseCurdOperation.checkIsContactIdExist(id)) {
                    if (!myPrefs.getContactId().equals(id)) {
                        dataBaseCurdOperation.updateNewNumber(id, phoneNumber, name, "updated");
                        UtilHandler.TriggerRefresh();
                    } else {
                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                myPrefs.setContactId("0");
                            }
                        }, 3000);
                    }
                } else {
                    dataBaseCurdOperation.insertServerContact(id, name, phoneNumber, "inserted", "newNumber", "newName");
                    UtilHandler.TriggerRefresh();  // triggering my sync adapter here...
                }
                myPrefs.setContactId(id);
            }
        } catch (Exception e) {
            Logger.LogError("Contact Exception", "occured");
        }
    }
}

}

使用contact observer,只有在发生任何更改时才会收到通知。它不会向您提供任何有关更改性质、添加/删除/更新或数据的信息?是的,这是我的问题。我们如何才能知道哪些数据已更改?您可以在数据库中保留联系人列表的上次修改副本,并且无论何时发生更改,您都可以将新联系人列表与上次修改的联系人列表进行比较。不是很好的解决方案,但这样你就可以跟踪变化。是的,我只是这样做,但bcoz它不是很好,也没有告诉哪些用户联系人(如姓名和电话号码)发生了变化。这就是为什么问这个问题的原因。你能分享计算差异的代码吗?