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它不是很好,也没有告诉哪些用户联系人(如姓名和电话号码)发生了变化。这就是为什么问这个问题的原因。你能分享计算差异的代码吗?