Android:插入/更新/删除联系人

时间:2014-11-01 08:57:49

标签: android android-service android-contentprovider android-contacts android-syncadapter

我正在开发一个应用程序,在其中列出设备联系人,并使用它们执行一些操作。我会按照以下链接中的说明收听联系人更改:Link 1Link 2

我的代码如下:

public class ContactService extends Service {
private int mContactCount;
Cursor cursor = null;
private int contactStateCheckingFlag=0;
static ContentResolver mContentResolver = null;

public static final String AUTHORITY = "com.example.contacts";
public static final String ACCOUNT_TYPE = "com.example.myapplication.account";
public static final String ACCOUNT = "myapplication";    
Account mAccount;

Bundle settingsBundle;    
int i=0;

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

@Override
public void onCreate() {
    super.onCreate();// Get contact count at start of service
    mContactCount = getContactCount();

    this.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver);
    Cursor curval =  getApplicationContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null);

    if (curval != null && curval.getCount() > 0) {
        curval.getCount();
    }
    curval.close();
}

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) {
        super.onChange(selfChange);         
        new ContactServiceAsyncClass().execute();           
    }       
};

private class ContactServiceAsyncClass extends AsyncTask<Void, Void, Void> {
    ArrayList<Integer> arrayListContactID = new ArrayList<Integer>();
    @Override
    protected void onPreExecute() {
        super.onPreExecute();           
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Get the current count of contacts
        int currentCount = getContactCount();

        // Add New Contact
        if (currentCount > mContactCount){
            Cursor contactCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

            if (contactCursor.getCount()<=0) {
                Log.d("Contact Cursor count"," is zero");
            }else {
                Log.d("Contact Cursor count", " > 0");                  
                // Fetch all contact ID from cursor
                if(contactCursor.moveToFirst()){
                    do {    
                        int contactID = contactCursor.getInt(contactCursor.getColumnIndex(ContactsContract.Data._ID));
                        arrayListContactID.add(contactID);
                    } while (contactCursor.moveToNext());
                }                   
                // Sort the array list having all contact ID
                Collections.sort(arrayListContactID);
                Integer maxID=Collections.max(arrayListContactID);
                Log.d("maxID", ""+maxID);                   
                // Get details of new added contact from contact id
                String whereName = ContactsContract.Data._ID + " = ?";// Where condition
                String[] whereNameParams = new String[] { ""+maxID}; // Pass maxID
                Cursor cursorNewContact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, whereName, whereNameParams, null);

                if(cursorNewContact.getCount()<=0){
                }else {
                    if(cursorNewContact.moveToFirst()){
                        do{
                            // Fetch new added contact details
                        } while(cursorNewContact.moveToNext());
                    }
                }
                cursorNewContact.close();
            }   
            contactCursor.close();
        } else if(currentCount < mContactCount){
            // Delete Contact/
            // CONTACT DELETED.
        } else if(currentCount == mContactCount){
            // Update Contact1
        }               
        mContactCount = currentCount;
        return null;
    }   

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
    }
}

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

我可以获取新添加的联系人。问题是如何删除和更新联系人?如何知道哪个联系人被删除和更新,因为联系人更改广播没有指定更改的联系人的ID?

请提供宝贵的建议并详细指导。

谢谢。

1 个答案:

答案 0 :(得分:0)

对于删除操作,

1.首先将以前的联系人ID列表存储在本地数据库中。

例如:您添加的联系人ID为 123,124,125

现在我们假设您上次添加的联系人( 125 )已被删除。

我们如何找到它?。

简单首先获取旧联系人列表的列表。并与当前联系人列表进行比较。

如果旧联系人列表元素不在新列表中,则该联系人将从手机中删除。

注意:如果删除操作已完成,则需要将联系人ID更新为DB。

对于更新操作,

1.使用VERSION标志指示您的联系人中的任何更改。

2.VERSION默认值为1.如果修改联系人,它会自动增加到2。

3.因此,您需要在本地数据库中存储旧版本值。并比较版本值增加与否。如果增加VERSION值,则需要更新此联系人。

参考官方链接,

https://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

对于完整的项目,

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.4_r2.1/com/android/exchange/adapter/ContactsSyncAdapter.java?av=f