Android Contact Application上联系人的默认帐户类型/名称是什么?

时间:2011-02-01 14:20:40

标签: android contacts contactscontract

我想阅读来自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);

我猜在设备上默认帐户的帐户类型和名称不为空,解决方案是什么?

3 个答案:

答案 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)

我提供了与您相同的体验,只能提出两种解决方法:

  1. 让用户做出决定。例如,向他显示所有原始联系人的列表,然后让他选择哪个是电话簿联系人与SIM卡联系人。

  2. 我使用三种不同设备的经验是,AccountManager不知道用于存储这些电话联系的帐户。例如,当您从AccountManager(AccountManager.getAccounts())获取帐户数组时,“com.htc.android.pcsc”在列表中而不是!但您可以使用这一事实:排除所有已知的帐户类型/名称,您获得的列表应该是所有电话簿联系人/ simcontacts的列表。

  3. 希望这些想法对你有所帮助:)我想阅读你对这些变通方法的想法,最终我错过了一些东西,或者有更好的解决方法。

答案 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 + "'";
}