仅获取SIM卡和设备存储的联系人

时间:2018-04-02 12:57:10

标签: android android-contentprovider android-contacts android-contentresolver contactscontract

我想显示一个列表,其中包含存储在设备和SIM卡中的联系人的姓名(GIVEN_NAMEFAMILY_NAME)(我想要支持帐户联系人)。

我现在所做的是:

1)我获得了accountTypesArray

中的所有帐户

2)我查询不包括帐户的RawContacts

String where = ContactsContract.RawContacts.ACCOUNT_TYPE + " NOT IN (" + makePlaceholders(accountTypesArray.length) + ") "; String whereArgs[] = accountTypesArray;

return new CursorLoader(getActivity(), ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID}, where, whereArgs, null);

3)我使用mimeType结构化名称

查询DATA

String where = ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "' AND " + ContactsContract.Data.RAW_CONTACT_ID + " IN (" + makePlaceholders(contactIDsArray.length) + ") ";

return new CursorLoader(getActivity(), ContactsContract.Data.CONTENT_URI, projection, where, contactIDsArray, SORT_ORDER);

问题是当contactIDsArray大小大于999且SQLite抛出太多SQL变量Exception时。 有更有效的方法吗?

提前谢谢

1 个答案:

答案 0 :(得分:1)

这需要我们从调查不同设备中获取的魔术字符串。

对于SIM卡联系人,请运行以下查询:

String selection = RawContacts.ACCOUNT_TYPE + " IN ('vnd.sec.contact.sim', 'com.oppo.contacts.sim')";
String[] projection = { RawContacts.CONTACT_ID, RawContacts.DISPLAY_NAME_PRIMARY };
getContentResolver().query(RawContacts.CONTENT_URI, projection, selection, null, null);

对于设备联系人,请尝试以下操作:

String selection = RawContacts.ACCOUNT_TYPE + " IN ('vnd.sec.contact.phone', 'com.htc.android.pcsc', 'com.sonyericsson.localcontacts', 'com.lge.sync', 'com.android.huawei.phone', 'Local Phone Account')";
String[] projection = { RawContacts.CONTACT_ID, RawContacts.DISPLAY_NAME_PRIMARY };
getContentResolver().query(RawContacts.CONTENT_URI, projection, selection, null, null);