Android 6 getAccountName() Отсутствует android.permission.GET_ACCOUNTS

Я получаю следующее исключение во время работы на устройстве Android 6.

java.lang.SecurityException: Missing android.permission.GET_ACCOUNTS

Это похоже на довольно прямое исключение, но для меня это не так. Мой манифест выглядит так:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="..." >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

<application
    ...

Кусок кода, который генерирует это исключение, представляет собой следующую строку:

mLoggedInEmail = Plus.AccountApi.getAccountName(mGoogleApiClient);

На устройстве Android 5 отлично работает.

Ответы

Ответ 1

Начиная с Android M, API 23, вам нужно запросить некоторое разрешение во время выполнения поверх объявления в манифесте.

См. эту ссылку для получения дополнительной информации: https://developer.android.com/training/permissions/requesting.html

В качестве быстрого обходного решения вы можете установить targetSdkVersion в 22 в build.gradle.

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

Это список разрешений, на которые повлияло это новое изменение:

  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ADD_VOICEMAIL
  • BODY_SENSORS
  • CALL_PHONE
  • КАМЕРЫ
  • GET_ACCOUNTS
  • PROCESS_OUTGOING_CALLS
  • READ_CALENDAR
  • READ_CALL_LOG
  • READ_CELL_BROADCASTS
  • READ_CONTACTS
  • READ_EXTERNAL_STORAGE
  • READ_PHONE_STATE
  • READ_SMS
  • RECEIVE_MMS
  • RECEIVE_SMS
  • RECEIVE_WAP_PUSH
  • RECORD_AUDIO
  • SEND_SMS
  • USE_SIP
  • WRITE_CALENDAR
  • WRITE_CALL_LOG
  • WRITE_CONTACTS
  • WRITE_EXTERNAL_STORAGE