Подтвердить что ты не робот

Ни пользователь 10102, ни текущий процесс не имеют android.permission.READ_PHONE_STATE

Я пытаюсь вызвать getCallCapablePhoneAccounts() метод android.telecom.TelecomManager класс. Хотя я добавил требуемое разрешение пользователя, я получаю исключение безопасности.

Вот строка кода, в которой я получаю исключение

List<PhoneAccountHandle> list = getTelecomManager().getCallCapablePhoneAccounts();

Пользовательский доступ добавлен в манифест

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

Исключение stacktrace      Вызывается: java.lang.SecurityException: getDefaultOutgoingPhoneAccount: ни пользователь 10102, ни текущий процесс имеет android.permission.READ_PHONE_STATE.             at android.os.Parcel.readException(Parcel.java:1599)             at android.os.Parcel.readException(Parcel.java:1552)             на com.android.internal.telecom.ITelecomService $Stub $Proxy.getDefaultOutgoingPhoneAccount(ITelecomService.java:615)             на android.telecom.TelecomManager.getDefaultOutgoingPhoneAccount(TelecomManager.java:439)

4b9b3361

Ответ 1

Вы используете Android M? Если это так, это связано с тем, что недостаточно объявить разрешения в манифесте. Для некоторых разрешений вы должны явно запрашивать пользователя во время выполнения: http://developer.android.com/training/permissions/requesting.html

Ответ 2

В Android >= 6.0 нам нужно запросить время выполнения запроса.

Шаг1: добавьте файл AndroidManifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

Шаг 2: разрешение запроса.

        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
        } else {
            //TODO
        }

Шаг 3: Обрабатывать обратный вызов при запросе разрешения.

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_READ_PHONE_STATE:
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                //TODO
            }
            break;

        default:
            break;
    }
}

Edit: Прочтите официальное руководство здесь Запрос разрешений во время выполнения

Ответ 3

Я испытывал эту проблему на устройствах Samsung (отлично на других). как и zyamys в своем комментарии, я добавил строку manifest.permission, но вместо, а не вместо исходной строки, так:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" />

Я нацелен на API 22, поэтому не нужно явно запрашивать разрешения.