2011-02-01 73 views
12

我想从ContactsContract API中读取联系人,该联系人仅属于电话/ SIM卡,并且希望避免与其他应用(如Facebook和Gmail)同步的联系人。我在模拟器上测试了我的代码,它工作正常,但在真实设备上它不返回任何结果。Android联系人应用程序中联系人的默认帐户类型/名称是什么?

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); 

我想对设备的默认帐户的帐户类型和名称不为空,该如何解决?

+0

所以我尝试了一个小样本应用程序来获取不同设备中使用的帐户类型和名称。在** HTC **帐户类型和NME是com.htc.android.pcsc和com.android.sim,而在索尼Xperia它是com.sonyerricson.contacts。因此,似乎所有设备使用不同的类型和名称,现在的问题是我如何获得默认帐户?我可以做这样的AccountManager.getAccounts()[0],并相信这将是设备上的默认帐户。 – 2011-02-02 15:07:51

+0

嗨拉胡尔,大家。我也想知道这个问题的答案。我只想从手机/ SIM卡本身提取联系人信息。 – Creniale 2011-05-04 07:15:09

+0

`我可以做一些像这样AccountManager.getAccounts()[0],并相信这将是设备上的默认帐户。“#: 不,你不能。如果帐户名称为空,则无法从`AccountManager.getAccounts()` – Autobots 2014-09-24 11:59:47

回答

2

我做了同样的遭遇像你一样,只能建议两种解决方法:

  1. 让用户做出决定。例如,向他显示所有原始联系人列表,然后让他选择哪一个是电话簿联系人与模拟联系人。

  2. 我对三种不同设备的体验是,AccountManager不知道用于存储这些电话联系的帐户。例如,当您像AccountDo(AccountManager.getAccounts())一样从AccountManager中获取帐户数组时,列表中的“com.htc.android.pcsc”为而不是!但是,您可以正确使用这一事实:排除所有已知的帐户类型/名称,您得到的列表应该是所有phonebookcontacts/simcontact的列表。

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

+0

获得您的解决方法的第2点听起来不错。但请注意,在手机上创建的某些联系人可能在Google帐户下。这些联系人不会同步到Gmail/Facebook,但它会出现在电话簿中。这些联系人位于AccountManager中的列表下的“com.google”下。 – Creniale 2011-05-06 07:37:24

1

我解决了这个问题。

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 + "'"; 
} 
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); 
} 
相关问题