阅读所有联系人(包括从Facebook等导入)

时间:2011-10-30 18:10:09

标签: android

根据此示例:http://developer.android.com/resources/samples/ContactManager/index.html 我写了一个简单的函数来获取所有联系人:

 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 个答案:

答案 0 :(得分:2)

我认为您需要查看RawContacts以找出相关信息。

以下是Android Contacts文档所说的内容:

  

RawContacts表中的一行表示Data和其他的一组   描述一个人并与单个联系人相关联的信息   资源。例如,一行可能定义与a关联的数据   person的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 :(得分:1)

在很多线程中提到FaceBook联系人无法通过第三方应用程序读取只有系统应用程序或活动才能读取。所以在任何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

那么如何从代码中启动“DirectDial”或“DirectMessage” 我查看了AndroidManifest.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'

所以这是lauch directdial或message

的代码
  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联系人现在将信息存储在某些地方以备将来使用。

一旦完成,我将发布我的开源应用程序的链接,我实际上正在使用它。