Android:仅获取更新和删除的联系人
我正在开发一个应用程序,在这个应用程序中,我使用的是Android联系人,无法继续。在应用程序中,应用程序需要将更新的联系人发送到服务器,或将删除的联系人发送到服务器进行同步 我使用联系服务的目的是:Android:仅获取更新和删除的联系人,android,android-contentprovider,android-contacts,android-syncadapter,Android,Android Contentprovider,Android Contacts,Android Syncadapter,我正在开发一个应用程序,在这个应用程序中,我使用的是Android联系人,无法继续。在应用程序中,应用程序需要将更新的联系人发送到服务器,或将删除的联系人发送到服务器进行同步 我使用联系服务的目的是: public class ContactService extends Service { private int mContactCount; Cursor cursor = null; static ContentResolver mContentResolver =
public class ContactService extends Service {
private int mContactCount;
Cursor cursor = null;
static ContentResolver mContentResolver = null;
// Content provider authority
public static final String AUTHORITY = "com.android.contacts";
// Account typek
public static final String ACCOUNT_TYPE = "com.example.myapp.account";
// Account
public static final String ACCOUNT = "myApp";
// Instance fields
Account mAccount;
Bundle settingsBundle;
@Override
public void onCreate() {
super.onCreate();
// Get contact count at start of service
mContactCount = getContactCount();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Get contact count at start of service
this.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver);
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
private int getContactCount() {
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if (cursor != null) {
return cursor.getCount();
} else {
cursor.close();
return 0;
}
} catch (Exception ignore) {
} finally {
cursor.close();
}
return 0;
}
private ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
this.onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
new changeInContact().execute();
}
};
public class changeInContact extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {
ArrayList<Integer> arrayListContactID = new ArrayList<Integer>();
int currentCount = getContactCount();
if (currentCount > mContactCount) {
// Contact Added
} else if (currentCount < mContactCount) {
// Delete Contact
} else if (currentCount == mContactCount) {
// Update Contact
}
mContactCount = currentCount;
return "";
}
@Override
protected void onPostExecute(String result) {
contactService = false;
} // End of post
}
}
公共类ContactService扩展服务{
私有int mContactCount;
游标=空;
静态ContentResolver mContentResolver=null;
//内容提供商授权
public static final String AUTHORITY=“com.android.contacts”;
//账户类型K
公共静态最终字符串帐户\u TYPE=“com.example.myapp.ACCOUNT”;
//帐目
公共静态最终字符串ACCOUNT=“myApp”;
//实例字段
账户mAccount;
束设置束;
@凌驾
public void onCreate(){
super.onCreate();
//在服务开始时获取联系人计数
mContactCount=getContactCount();
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//在服务开始时获取联系人计数
this.getContentResolver().registerContentObserver(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,true,mObserver);
return Service.START\u STICKY;
}
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
私有int getContactCount(){
试一试{
cursor=getContentResolver().query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,null,null);
如果(光标!=null){
返回cursor.getCount();
}否则{
cursor.close();
返回0;
}
}捕获(异常忽略){
}最后{
cursor.close();
}
返回0;
}
私有ContentObserver=newContentObserver(newHandler()){
@凌驾
公共void onChange(布尔自更改){
this.onChange(selfChange,null);
}
@凌驾
public void onChange(布尔自更改,Uri){
新建changeInContact().execute();
}
};
公共类changeInContact扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的字符串doInBackground(字符串…arg0){
ArrayList arrayListContactID=新的ArrayList();
int currentCount=getContactCount();
如果(currentCount>mContactCount){
//联系人添加
}else if(currentCount
我面临的问题如下:
A:在上述获取最近更新联系人的代码中我需要检查设备中每个联系人的版本,以及我的数据库存储的联系人版本。这花费了大量时间进行大量接触
B.要删除联系人,我需要检查数据库中存储的原始id的数据是否存在于设备中。如果没有,则删除该联系人。检查整个联系人也需要太多时间
但在whats应用程序中,同样的联系人刷新只需几秒钟,比如2到3秒钟
编辑:
在以下模块的上述代码中:
if (currentCount > mContactCount) {
// Contact Added
Log.d("In","Add");
} else if (currentCount < mContactCount) {
// Delete Contact
Log.d("In","Delete");
} else if (currentCount == mContactCount) {
// Update Contact
Log.d("In","Update");
}
if(currentCount>mContactCount){
//联系人添加
日志d(“输入”、“添加”);
}else if(currentCount
我把原木放好了。所以更新模块被调用了很多次,而且当我添加或删除的时候
请指导我并建议我如何缩短上述任务的时间…使用以下查询获取所有已删除和更新的联系人
public static final String ACCOUNT_TYPE = "com.android.account.youraccounttype"
public static final String WHERE_MODIFIED = "( "+RawContacts.DELETED + "=1 OR "+
RawContacts.DIRTY + "=1 ) AND "+RawContacts.ACCOUNT_TYPE+" = '"+ ACCOUNT_TYPE+"'";
c = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI,
null,
WHERE_MODIFIED,
null,
null);
谢谢你的回答。但上面的答案让我删除或更新了我的应用程序帐户联系人。我需要所有已删除或更新的联系人。如果您对所有帐户感兴趣,只需从where中删除帐户类型条件。我也尝试过,但得到了许多已删除和更新的号码。只需要最新更新或删除的号码。查询将返回所有更新和删除的号码,直到它们被所属帐户类型标记为已同步。如果您重复获得相同的号码,则所属帐户类型的联系人同步出现问题。可能是您可以详细说明您在测试中使用的帐户。它们是像谷歌、交易所这样的标准账户,还是由定制应用程序添加的账户,这些账户可能不太可靠。整体
rawscontacts.DIRTY
是将联系人标记为已更新的标准方法。