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

Rah*_*ary 13 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);
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*ong 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 啊,我明白了.添加虚拟联系人作为默认值并获取类型和名称.谢谢.这将很好地解决.一个好的工作.=) (2认同)
  • 嗯,似乎这对Nexus S不起作用.它适用于2.1的HTC英雄.在Nexus S上,当我尝试从光标获取帐户名称/类型时,我得到一个空值. (2认同)

Chr*_*ner 3

我和你有同样的经历,只能建议两种解决方法:

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

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

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