如何检索联系人的所有可用帐户?

时间:2017-08-30 11:09:16

标签: android

我想以编程方式检索Android手机/平板电脑上可以用于联系人的所有帐户 ,而不知道任何existents帐户 。< / p>

我使用 AccountManager 来检索所有帐户,但这也为我提供了其他帐户(例如电子邮件帐户)。

所以我添加了 AccountManager.hasFeatures()来选择只有“ service_contacts ”功能的帐户,但这样我才能找到Google帐户而不是其他人(例如在我的手机上我使用Davdroid帐户作为我的联系人,我的程序不选择此帐户)。

那么,我哪里错了?我应该使用其他API吗? 有人可以建议我(可能以一些代码作为例子)来实现目标吗?

感谢您的帮助

编辑:

对不起我对英语的不完全了解,但我认为自己解释得很好。

我不想检索我已经知道的帐户,也不想检索我已经知道的类型(getAccountsByType)。 我想在手机上部署一个应用程序我不知道,可以拥有任何帐户(可能没有Google帐户),没有任何先前的知识,并且仅检索该帐户可用于联系人( 他们是您在添加新联系人时可在“联系人”应用程序中选择的帐户 )。

也许我错了,我对此表示不满,但我不能将此视为一个重复的问题,而且我无法理解如何使用您的答案解决我的具体问题。

再次感谢您的回答

SOLUTION:

我使用ContentResolver.getSyncAdapterTypes()来选择与“ com.android.contacts ”相关的所有同步适配器,因此代码是(我使用EditText进行显示):

    private void getAccountsForContacts() {
    // Constants
    final String SYNC_AUTHORITY = "com.android.contacts";
    // Variables
    List<SyncAdapterType> okSyncs;
    SyncAdapterType[] mySyncTypes;
    AccountManager accountManager;
    Account[] tempAccounts;
    List<Account> allAccounts;
    String textAccounts;
    int i;
    int j;

    // Clear the text
    EditText editListAccounts = (EditText) findViewById(R.id.editListAccounts);
    editListAccounts.setText("");
    // Initialize all variables
    okSyncs = new ArrayList<SyncAdapterType>();
    allAccounts = new ArrayList<Account>();
    textAccounts = "";
    // Get all sync adapters
    mySyncTypes = ContentResolver.getSyncAdapterTypes();
    if (mySyncTypes.length > 0) {
        for (i = 0; i < mySyncTypes.length; i++) {
            // Select the only adapters for contacts
            if (mySyncTypes[i].authority.equals(SYNC_AUTHORITY)) {
                okSyncs.add(mySyncTypes[i]);
            }
        }
    }
    if (okSyncs.size() > 0) {
        accountManager = AccountManager.get(this);
        // From sync get all related accounts
        for (i = 0; i < okSyncs.size(); i++) {
            tempAccounts = accountManager.getAccountsByType(okSyncs.get(i).accountType);
            if (tempAccounts.length > 0) {
                for (j = 0; j < tempAccounts.length; j++) {
                    allAccounts.add(tempAccounts[j]);
                }
            }
        }
    }
    if (allAccounts.size() > 0) {
        for (i=0; i<allAccounts.size(); i++) {
            textAccounts += allAccounts.get(i).toString();
        }
    } else {
        textAccounts = getResources().getString(R.string.main_accounts_not_found);
    }
    editListAccounts.setText(textAccounts);
}

我希望它对某人有用。

非常感谢。

1 个答案:

答案 0 :(得分:1)

我想这个可以帮助你自己解决它并以那种方式学习

AccountManager.getAccountsByType(java.lang.String)