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

Android 如何检索联系人的所有可用帐户?,android,Android,我想通过编程方式检索android手机/平板电脑上可用于联系人的所有帐户,而不必事先了解现有帐户 我使用AccountManager来检索所有帐户,但这也会给我其他帐户(例如电子邮件帐户) 因此,我添加了AccountManager.hasFeatures(),以选择唯一具有“service\u contacts”功能的帐户,但通过这种方式,我只能找到Google帐户,而不能找到其他帐户(例如,在我的手机上,我的联系人使用Davdroid帐户,我的程序不选择此帐户) 那么,我错在哪里?还有其他A

我想通过编程方式检索android手机/平板电脑上可用于联系人的所有帐户,而不必事先了解现有帐户

我使用AccountManager来检索所有帐户,但这也会给我其他帐户(例如电子邮件帐户)

因此,我添加了AccountManager.hasFeatures(),以选择唯一具有“service\u contacts”功能的帐户,但通过这种方式,我只能找到Google帐户,而不能找到其他帐户(例如,在我的手机上,我的联系人使用Davdroid帐户,我的程序不选择此帐户)

那么,我错在哪里?还有其他API我应该使用吗? 有人能给我建议一个实现目标的方法吗

谢谢你的帮助

编辑:

对不起,我的英语知识不是很好,但我认为我自己解释得很好

我不想检索我已经知道的帐户,或者检索我已经知道的类型(getAccountsByType)。 我想在手机上部署一个我不知道的应用程序,该应用程序可以拥有任何帐户(可能没有谷歌帐户),而不需要任何以前的知识,并且只检索能够用于联系人的帐户(它们是添加新联系人时可以在“联系人”应用程序中选择的帐户

也许我错了,我请求原谅,但我不能把这看作是一个重复的问题,我也不明白如何用你的答案来解决我非常具体的问题

再次感谢你的回答

解决方案:

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

private void getAccountsForContacts(){
//常数
最终字符串SYNC_AUTHORITY=“com.android.contacts”;
//变数
列出okSyncs;
SyncAdapterType[]mySyncTypes;
会计经理会计经理;
账户[]临时账户;
列出所有账目;
字符串文本帐户;
int i;
int j;
//清除文本
EditText editListAccounts=(EditText)findViewById(R.id.editListAccounts);
editListAccounts.setText(“”);
//初始化所有变量
okSyncs=新建ArrayList();
allAccounts=新的ArrayList();
textAccounts=“”;
//获取所有同步适配器
mySyncTypes=ContentResolver.getSyncAdapterTypes();
如果(mySyncTypes.length>0){
对于(i=0;i0){
accountManager=accountManager.get(这个);
//从同步获取所有相关帐户
对于(i=0;i0){
对于(j=0;j0){

对于(i=0;i我想这一个可以帮助你自己解决问题,并通过这种方式学习


如果API没有您想要的过滤器,请过滤包含您想要的帐户的集合。类似的,请再次阅读编辑后的文章,如果您同意,请删除“重复”标签。谢谢
    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);
}