我目前正在开展一个项目,我想访问移动联系人,因此我设法创建了accountmanager
帐户,并且还能够执行Syncadapter
操作。我可以看到我的帐户是在移动版settings->Accounts
中创建的。但是,当我尝试使用以下代码获取我帐户的所有联系人时,它不起作用。它显示除我的应用帐户联系人以外的所有应用程序(google.com和WhatsApp.com)联系人。
Cursor cursor = getContext().getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,
new String[]{ContactsContract.RawContacts.DIRTY, ContactsContract.RawContacts.ACCOUNT_TYPE},
null,
null,
null);
if (cursor != null && cursor.getCount() >0) {
cursor.moveToFirst();
while(!cursor.isAfterLast()) {
Log.d("Dirty",cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.DIRTY)));
Log.d("ACCountType",cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)));
cursor.moveToNext();
}
cursor.close();
}
我不明白是否需要创建ContentProvider
并代表我的帐户将所有联系人插回Contactsprovider
?
答案 0 :(得分:0)
不确定您是否完全了解ContactsProvider的工作原理。
你应该知道一些事情:
当您将联系人同步到自己的帐户时,必须按ContactsContract.RawContacts
所示指定帐户ContentValues values = new ContentValues(); values.put(RawContacts.ACCOUNT_TYPE, accountType); values.put(RawContacts.ACCOUNT_NAME, accountName); Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri);
当您阅读联系人时,您将获得所有帐户的联系人,除非您指定了Uri查询参数或选择:
Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon() .appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName) .appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType) .build(); Cursor c1 = getContentResolver().query(rawContactUri, RawContacts.STARRED + "<>0", null, null, null)
此查询返回指定帐户的所有已加星标的联系人。
如果您的代码作为同步适配器运行,您还必须添加Uri查询参数CALLER_IS_SYNC_ADAPTER
,否则您可能会为许多操作获得不同的结果。