2011-10-30 65 views
1

根據此示例:http://developer.android.com/resources/samples/ContactManager/index.html 我寫了一個簡單的功能讓所有聯繫人:閱讀所有聯繫人(包括從Facebook導入等)

Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
      (mShowInvisible ? "0" : "1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

它運作良好,但它不到風度與進口回報接觸Facebook應用程序(但它們在「通訊錄」應用程序中可見)。有關如何閱讀聯繫人應用程序中的所有聯繫人的任何想法?

感謝

回答

2

我認爲你需要看看RawContacts找出信息。

下面是Android的Contacts文檔說什麼:

在RawContacts表中的一行表示一組數據和其他信息 描述一個人與一個單一的接觸 源相關聯。例如,一行可能會定義與某個人的Google或Exchange帳戶或Facebook好友關聯的數據。有關更多 信息,請參閱ContactsContract.RawContacts。

RawContacts文檔說:

的最好辦法陪讀相關聯的所有數據 它是通過使用ContactsContract.RawContacts.Entity目錄原始接觸。 如果原始聯繫人具有數據行,則實體光標將爲每個數據行包含一行 。如果原始聯繫人沒有數據行,則光標 仍將包含具有原始聯繫人級別信息的一行。

還有一些示例代碼有:

Uri rawContactUri = 
    ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 

Uri entityUri = 
    Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY); 

Cursor c = 
    getContentResolver().query(entityUri, 
           new String[]{RawContacts.SOURCE_ID, 
              Entity.DATA_ID, 
              Entity.MIMETYPE, 
              Entity.DATA1}, 
           null, 
           null, 
           null); 
try 
{ 
    while (c.moveToNext()) 
    { 
     String sourceId = c.getString(0); 

     if (!c.isNull(1)) 
     { 
      String mimeType = c.getString(2); 
      String data = c.getString(3); 
      ... 
     } 
    } 
} 
finally 
{ 
    c.close(); 
} 
+1

什麼是rawContactId和從哪裏得到它 – zaiff

+0

這根本沒有什麼幫助,因爲問題是首先從提供者處獲取聯繫人。這個答案帶你無處... – takecare

1

這是提這麼多線程Facebook聯繫人無法通過第三方應用程序只有系統的應用程序或活動可以在任何read.So閱讀Android手機'DirectDial'和'DirectMessage'可以通過主屏幕上的長按創建,可以閱讀Facebook聯繫人。所以我深入瞭解Android源代碼以找到它在那裏閱讀Facebook聯繫人的方式。

我的發現。

要爲'DirectDial','DirectMessage'和ContactShortcut創建快捷方式,它將啓動ContactSelectionActivity,它將返回Intent作爲結果的聯繫人信息'name''number'和'icon'。如果有人在這裏研究什麼是的鏈接相同

https://github.com/android/platform_packages_apps_contacts/blob/master/src/com/android/contacts/activities/ContactSelectionActivity.java

那麼如何從代碼 我看在AndroidManifest內推出的「DirectDial」或「DirectMessage」。XML

https://github.com/android/platform_packages_apps_contacts/blob/master/AndroidManifest.xml

 <activity-alias android:name="alias.DialShortcut" 
     android:targetActivity=".activities.ContactSelectionActivity" 
     android:label="@string/shortcutDialContact" 
     android:icon="@mipmap/ic_launcher_shortcut_directdial" 
     android:enabled="@*android:bool/config_voice_capable"> 

     <intent-filter> 
      <action android:name="android.intent.action.CREATE_SHORTCUT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.CAR_MODE" /> 
     </intent-filter> 

    </activity-alias> 

    <activity-alias android:name="alias.MessageShortcut" 
     android:targetActivity=".activities.ContactSelectionActivity" 
     android:label="@string/shortcutMessageContact" 
     android:icon="@mipmap/ic_launcher_shortcut_directmessage" 
     android:enabled="@*android:bool/config_voice_capable"> 

     <intent-filter> 
      <action android:name="android.intent.action.CREATE_SHORTCUT" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 

    </activity-alias> 

在這裏,他們創造ContactSelectionActivity的別名推出 'DirectDial' 或 'DirectMessage'

所以這裏是代碼勞克directdial或消息

private boolean launchContactSelector() { 
    ComponentName distantActivity; 
    if (Constants.PHONE_CALL) //check what you want to call 
     distantActivity = new ComponentName("com.android.contacts", "alias.DialShortcut"); 
    else { 
     distantActivity = new ComponentName("com.android.contacts", "alias.MessageShortcut"); 
    } 
    Intent intent = new Intent(); 
    intent.setComponent(distantActivity); 
    intent.setAction(Intent.ACTION_PICK); 
    intent.setAction(Intent.ACTION_CREATE_SHORTCUT); 
    startActivityForResult(intent, selector); 
    return true; 

} 

一旦選擇聯繫人

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode != Activity.RESULT_OK) return; 
    Intent intent = new Intent(); 
    intent = ((Intent) data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT)); 
    switch (requestCode) { 
    case Constants.PHONE_CALL: { 
     intent.setAction(Intent.ACTION_CALL); 
     break; 
    } 
    case Constants.MESSAGE: { 
     intent.setAction(Intent.ACTION_SENDTO); 
     break; 
    } 
    } 
    String number = intent.getData().toString(); //It will have the phone number 

    String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); //Contact name 
    ImageView image = new ImageView() //Contact image 
    image.setImageBitmap((Bitmap) data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON)); 

    // Must need to set the Intent.ACTION_SENDTO or Intent.ACTION_CALL because default   permission sent is CALL_PRIVILEGED which is for system Activty you .  

    startActivity(data); 

    } 

因此有可能在您的應用程序中閱讀Facebook聯繫人現在將信息存儲在某處以供將來使用。

一旦它完成,我會在我實際使用它的時候發佈我的開源應用程序的鏈接。