如何更改特定的,现有的,与Google之一的联系人的ACCOUNT_TYPE字段,并使其同步?

时间:2016-05-02 13:56:51

标签: android android-contacts google-account

背景

假设我在设备上有联系人(或者我即将创建一个联系人),我希望将其保存到Google帐户中,以便与之同步。我还希望能够让用户选择要保存的帐户。

这是三星设备在创建新联系人时显示的内容:

enter image description here

如果设备也有三星帐户,它也会显示在此对话框中。

问题

我已经找到了如何插入一个新的(here),但我记得,只有在特定情况下才允许修改现有的联系人(可能只有当联系人在设备中时/ sim本身,而不是其他帐户)。

我也无法找到一种方法来获取要保存的帐户列表(设备,SIM卡,Google,...)

我发现了什么

我已在三星设备上运行此代码,该设备上有SIM卡,存储空间和Google帐户的联系人:

        final Map<String, String> result = new HashMap<>();
        final Cursor cursor = getContentResolver()
                .query(ContactsContract.RawContacts.CONTENT_URI, new String[]{RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME},
                        null, null,
                        null);
        final int accountNameIdx = cursor.getColumnIndex(RawContacts.ACCOUNT_NAME);
        final int accountTypeIdx = cursor.getColumnIndex(RawContacts.ACCOUNT_TYPE);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            result.put(cursor.getString(accountTypeIdx), cursor.getString(accountNameIdx));
        }
        cursor.close();
        Log.d("AppLog", "accounts found:");
        for (Entry<String, String> account : result.entrySet())
            Log.d("AppLog", account.getKey() + ":" + account.getValue());

结果是:

vnd.sec.contact.sim:primary.sim.account_name
com.google:somegmailaddress@gmail.com
vnd.sec.contact.phone:vnd.sec.contact.phone

但是,正如我发现的那样(here),各种设备上的SIM /设备帐户可能会有所不同。

问题

  1. 修改现有联系人的正确方法是什么,以便其ACCOUNT_TYPE为Google?

  2. 使用下一个代码的第一项是否会获得用户的主要Google帐户,因此我应该考虑使用它:

    AccountManager.get(context).getAccountsByType("com.google")
    

  3. 有没有办法检查找到的帐户是否已启用自动同步,如果没有,请使用意图转到屏幕以使其同步?一旦联系人修改完成,是否可以触发同步,以防自动同步未启用?

  4. 有没有办法获取可以为联系人设置的所有可用帐户(包括sim / local),以便我可以向用户显示一个对话框,以选择保存联系人的帐户?将&#34; getAccounts&#34;是否足够,或者我应该以某种方式过滤结果?

  5. 编辑:对于#4,似乎&#34; getAccounts&#34;我没有提供sim&amp; local作为可能存入的帐户。不过,我想知道如何获取它们,以便我可以让用户选择它们。

1 个答案:

答案 0 :(得分:1)

这里有很多问题。我或许可以回答一些问题。我们来看看

1)您无法修改现有用户的Account_Type。这是解释here 这清楚地表明帐户类型只能更改一次。最有可能使用此方法,以便您可以为联系人的每一行添加帐户类型。

2)您提供的代码会向您返回com.google类型的所有帐户的列表。因此,如果用户使用3个Google帐户登录了他们的手机,则会获得所有3的列表。现在,在这种情况下,理想的用户体验是向用户显示所有这些帐户的列表供他们选择,然后您执行操作该特定帐户的用户选择。 有关更多代码Check here

3)要检查是否启用了同步,请使用ContactContracts.Settings中的标志SHOULD_SYNC。发送一个意图我认为你只是设置了这个值,并且数据源会实现相关的内容观察者来完成这项工作对你而言。

4)我不确定AccountManager是否掌握了SIM卡联系人的详细信息。至少文档没有提到这一点。您可以使用root设备进行调试并提取相同的sqlite数据库,但是如果您只想获取详细信息,我认为stackoverflow question有一些值得尝试的方法,看起来它们可能在它的表面上工作

希望这能回答你的问题。