2011-10-30 94 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联系人现在将信息存储在某处以供将来使用。

一旦它完成,我会在我实际使用它的时候发布我的开源应用程序的链接。