我想阅读来自ContactsContract API的联系人,该联系人仅属于手机/ SIM卡,并希望避免与其他应用程序(如facebook和gmail)同步的联系人。我在模拟器上测试了我的代码并且它工作正常,但在真实设备上它不会返回任何结果。
ContentResolver cr = AndroidContext.getContext()
.getContentResolver();
Cursor nativeContacts = cr.query(RawContacts.CONTENT_URI,
new String[] { RawContacts._ID, RawContacts.VERSION, RawContacts.CONTACT_ID },
RawContacts.DELETED + "<> 1 AND " + RawContacts.CONTACT_ID
+ " IS NOT NULL AND " + RawContacts.ACCOUNT_NAME + " IS NULL AND "
+ RawContacts.ACCOUNT_TYPE + " IS NULL", null, null);
我猜在设备上默认帐户的帐户类型和名称不为空,解决方案是什么?
答案 0 :(得分:10)
我找不到获取SIM帐户的方法了。 但我正在使用下面的代码来获取默认帐户名称和类型。
public void getDefaultAccountNameAndType() {
String accountType = "";
String accountName = "";
long rawContactId = 0;
Uri rawContactUri = null;
ContentProviderResult[] results = null;
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_NAME, null).withValue(RawContacts.ACCOUNT_TYPE, null).build());
try {
results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch(Exception e) {
e.printStackTrace();
} finally {
ops.clear();
}
for (ContentProviderResult result : results) {
rawContactUri = result.uri;
rawContactId = ContentUris.parseId(rawContactUri);
}
Cursor c = getContentResolver().query(
RawContacts.CONTENT_URI
, new String[] {RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME}
, RawContacts._ID+"=?"
, new String[] {String.valueOf(rawContactId)}
, null);
if(c.moveToFirst()) {
if(!c.isAfterLast()) {
accountType = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_TYPE));
accountName = c.getString(c.getColumnIndex(RawContacts.ACCOUNT_NAME));
}
}
getContentResolver().delete(rawContactUri, null, null);
c.close();
c = null;
preference.setString("contactAccountType", accountType);
preference.setString("contactAccountName", accountName);
}
答案 1 :(得分:3)
我提供了与您相同的体验,只能提出两种解决方法:
让用户做出决定。例如,向他显示所有原始联系人的列表,然后让他选择哪个是电话簿联系人与SIM卡联系人。
我使用三种不同设备的经验是,AccountManager不知道用于存储这些电话联系的帐户。例如,当您从AccountManager(AccountManager.getAccounts()
)获取帐户数组时,“com.htc.android.pcsc”在列表中而不是!但您可以使用这一事实:排除所有已知的帐户类型/名称,您获得的列表应该是所有电话簿联系人/ simcontacts的列表。
希望这些想法对你有所帮助:)我想阅读你对这些变通方法的想法,最终我错过了一些东西,或者有更好的解决方法。
答案 2 :(得分:1)
我解决了这个问题。
Account[] accountList = AccountManager.get(this).getAccounts();
String accountSelection = "";
for(int i = 0 ; i < accountList.length ; i++) {
if(accountSelection.length() != 0)
accountSelection = accountSelection + " AND ";
accountSelection = accountSelection + ContactsContract.Groups.ACCOUNT_TYPE + " != '" + accountList[i].type + "'";
}