2011-02-01 66 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); 
} 
相關問題