Как получить контактную информацию Android без разрешения READ_CONTACTS - PullRequest
0 голосов
/ 14 октября 2018

Согласно официальным документам на https://developer.android.com/guide/components/intents-common#Contacts

Вы можете использовать намерение выбора

public void selectContact() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}

}

Для получения информации о том, как получить контактЕсли у вас есть контактный URI, прочитайте раздел «Извлечение сведений для контакта».Помните, что при получении URI контакта с указанным выше намерением вам не не требуется разрешение READ_CONTACTS для чтения сведений об этом контакте.

Указывает на https://developer.android.com/training/contacts-provider/retrieve-details для получения подробной информации о контакте

Когда я следую инструкциям по ссылке выше, я получаю

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data from pid=5313, uid=10087 requires android.permission.READ_CONTACTS, or grantUriPermission()

Я пытался получить контактную информацию через

  • Загрузчик (как в инструкции по ссылке)
  • getContentResolver (). Query ()
  • пробовал как с lookupKey, так и с получением идентификатора контакта

Каждый путьдает исключение для android.permission.READ_CONTACTS.Есть ли пример этого, который работает так, как написано в документации?

Минимальный, Полный и Проверяемый пример на

https://github.com/aaronvargas/ContactsSSCCE

Для тестирования как с READ_CONTACTS, так и без неговам придется изменить его в настройках системного приложения

- Редактировать

Создана проблема в Android Issue Tracker в https://issuetracker.google.com/issues/118400813

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Android API ContactsContract хранятся в трех разных таблицах: Contacts, RawContacts и Data.

Вы получаете временное разрешение на чтение данных через contactUri, что означает, что выможет читать только данные из таблицы Contacts и только для выбранного контакта.

Это поля, которые хранятся в таблице Contacts, которую вы можете получить, другие поля, такие как телефон, электронная почта и т. д.. хранятся в таблице Data и требуют разрешения READ_CONTACTS

_id
contact_chat_capability
contact_last_updated_timestamp
contact_presence
contact_status
contact_status_icon
contact_status_label
contact_status_res_package
contact_status_ts
custom_ringtone
dirty_contact
display_name
display_name_alt
display_name_reverse
display_name_source
has_email
has_phone_number
in_default_directory
in_visible_group
is_private
is_user_profile
last_time_contacted
link
link_count
link_type1
lookup
name_raw_contact_id
phonebook_bucket
phonebook_bucket_alt
phonebook_label
phonebook_label_alt
phonetic_name
phonetic_name_style
photo_file_id
photo_id
photo_thumb_uri
photo_uri
pinned
sec_custom_alert
sec_custom_vibration
sec_led
send_to_voicemail
sort_key
sort_key_alt
starred
times_contacted

ЧТО ВЫ МОЖЕТЕ СДЕЛАТЬ

Если вам нужен один из следующих элементов данныхо контакте: телефон, электронная почта, адрес, вы можете переключиться на использование определенного намерения ACTION_PICK, запрашивающего этот конкретный тип, и тогда у вас будет доступ к одному элементу информации о выбранном контакте.Например, если вашему приложению нужен номер телефона выбранного контакта, выполните следующие действия:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT_REQUEST);

Затем в onActivityResult вы получите выбранный контакт + телефон:

if (resultCode == RESULT_OK) {
       Uri phoneUri = data.getData();
       Cursor cursor = getContentResolver().query(phoneUri, null, null, null, null);
       DatabaseUtils.dumpCursor(cursor);
}
0 голосов
/ 14 октября 2018
    You need this permission in android Manifest 
    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

   and need to grant the permission run something like this 

     private void requestContactPermission() {
        final String[] permissions = new String[]{Manifest.permission.READ_CONTACTS};
        ActivityCompat.requestPermissions(this, permissions, REQUEST_CONTACT_PERM);
    }

      private boolean isReadContactPermissionGranted() {
        return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 
          == PackageManager.PERMISSION_GRANTED;
       }

  on Permission granted, you would get callback to your activity  

        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode != REQUEST_CONTACT_PERM) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            return;
        }
     if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            //call your contact pick method
              return;
        }
      }

Итак, прежде чем вызывать метод выбора контактов, убедитесь, что у вас есть проверка прав доступа

            if (isReadContactPermissionGranted()) {
               //Start method
            } else {
                requestContactPermission();
            }
...