Android 联系人应用程序上联系人的默认帐户类型/名称是啥?

Posted

技术标签:

【中文标题】Android 联系人应用程序上联系人的默认帐户类型/名称是啥?【英文标题】:What is the default Account Type / Name for contacts on Android Contact Application?Android 联系人应用程序上联系人的默认帐户类型/名称是什么? 【发布时间】:2011-06-19 07:37:18 【问题描述】:

我想从仅属于电话/SIM 卡的 ContactsContract API 读取联系人,并希望避免从 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);

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

【问题讨论】:

所以我尝试了一个小示例应用程序来获取不同设备中使用的帐户类型和名称。在 HTC 上,帐户类型和 nme 是 com.htc.android.pcsc 和 com.android.sim,而在 Sony Xperia 上是 com.sonyerricson.contacts。所以似乎所有设备都使用不同的类型和名称,现在的问题是我如何获得默认帐户?我可以做这样的事情 AccountManager.getAccounts()[0] 并相信这将是设备上的默认帐户。 大家好,Rahul。我也想知道这个问题的答案。我只想从手机/sim 本身中提取联系信息。 Can I do something like this AccountManager.getAccounts()[0] and trust that this will be the default account on device. 不,你不能。如果账户名为空,则无法从AccountManager.getAccounts()获取 【参考方案1】:

我还没有找到获取 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);

【讨论】:

啊,我明白了。默认添加一个虚拟联系人并获取类型和名称。谢谢。那会很顺利。一个很好的解决方法。 =) 嗯,这似乎不适用于 Nexus S。它适用于 2.1 版的 HTC hero。在 Nexus S 上,当我尝试从光标中获取帐户名称/类型时,我得到了一个空值。【参考方案2】:

我遇到了和你一样的经历,只能建议两种解决方法:

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

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

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

【讨论】:

解决方法的第 2 点听起来不错。但请注意,在手机上创建的某些联系人可能在 Google 帐户下。这些联系人不会同步到 gmail/facebook,但会出现在电话簿中。这些联系人位于 AccountManager 列表中的“com.google”下。 这个答案仍然对社区有帮助:) 谢谢大家【参考方案3】:

我解决了这个问题。

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

【讨论】:

你需要“android.permission.GET_ACCOUNTS”权限 这是否意味着 SIM 和 PHONE 帐户类型不在列表中(getAccounts())?我会检查并验证这一点,谢谢分享。 此代码仅显示不在任何帐户下的联系人。用户创建为 Google 帐户的联系人也不会显示。请注意,Google 帐户与 Gmail 联系人不同。 我认为这是在手机/设备上创建联系人的唯一方法。 @Creniale 和 Rahul Choudhary,如果我错了,请纠正我。 @BradHong,我能够通过添加清单权限来完成它。

以上是关于Android 联系人应用程序上联系人的默认帐户类型/名称是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android原生联系人应用程序删除每个帐户联系人

Android 联系人 - android 联系人的所有帐户类型是啥?

邮政编码无处不在(PCA 预测)在 Dynamics 365 移动应用程序中的联系人或帐户表单上不起作用

如何在android模拟器上放置联系人?

如何从 Android 联系人中的联系人 ID 获取只读帐户名称

获取具有类型过滤功能的 Android 联系人,仅限于特定帐户