Читать все контакты (в том числе импортированные из Facebook и т. Д.) - PullRequest
1 голос
/ 30 октября 2011

Согласно этому образцу: 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 ]

2 голосов
/ 30 октября 2011

Я думаю, вам нужно взглянуть на RawContacts, чтобы узнать эту информацию.

Вот что говорят Android Contacts документы:

Aстрока в таблице 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 голос
/ 16 апреля 2013

Это упоминание во многих темах. Контакт FaceBook не может быть прочитан сторонним приложением, может прочитать только системное приложение или действие. Так на любом телефоне Android 'DirectDial' и 'DirectMessage', который кто-то может создать долгим нажатиемна главном экране можно прочитать контакт Facebook.Поэтому я копаюсь в исходном коде Android, чтобы найти, что это такое, чтобы прочитать контакт в Facebook.

Мои выводы.

Чтобы создать ярлыки для DirectDial, DirectMessage и ContactShortcut, он запустится.ContactSelectionActivity, которое будет возвращать Намерение как результат, имеющий контактную информацию «имя», «номер» и «значок». Если вы хотите что-то понять, вот ссылка на ту же

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'

Так вот код для запуска 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 в вашем приложении. Теперь храните информацию, которую можно использовать в будущем.

Я опубликую ссылку моего приложения с открытым исходным кодом, как только оно будет завершено, где я на самом деле использую это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...