Ни пользователь 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)
Ответы
Ответ 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, поэтому не нужно явно запрашивать разрешения.