В моем приложении я хочу проверить, получает ли пользователь телефонный звонок (нет необходимости получать какие-либо данные о телефоне, например номер телефона).Поэтому я хочу получить доступ к опасному рейтингу разрешения READ_PHONE_STATE в моем фрагменте во время выполнения, например:
if (ContextCompat.checkSelfPermission(Application.getActiveActivity(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(Application.getActiveActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
}
В своей деятельности я обрабатываю результат разрешения следующим образом:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
// success, do fancy stuff
}
else
{
// show alert
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
Не забываяЧтобы добавить разрешения в AndroidManifest:
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:requiredFeature="false"/>
(разрешение помечено как необязательное, поскольку приложение работает не только на телефонах, но и на планшетах)
Этот кодработает как предназначено для Android 6 и 7. Появится всплывающее окно, запрашивающее у пользователя разрешение на доступ к состоянию телефона.В зависимости от выбора пользователя, grantResults в onPermissionsResult()
действия являются либо PERMISSION_GRANTED, либо PERMISSION_DENIED.Пока все хорошо.
Моя проблема здесь в том, что поведение в Android 8 и 9 отличается. Хотя я запрашиваю разрешения READ_PHONE_STATE в моем фрагменте, никогда не отображается всплывающее окно с просьбой предоставить пользователюих.Итак, grantResults в моей активности onPermissionsResult()
всегда PERMISSION_DENIED.
Я также пытался вручную активировать разрешения телефона в настройках приложения, но разрешения телефона даже не указаны (несмотря на Android 6 и 7).
Я прочиталчто Android хочет ограничить использование телефона и доступа к SMS для приложений в 2019 году. Но другие приложения, такие как WhatsApp, все еще могут использовать разрешение телефона.Есть ли что-то, что мне не хватает?Мы будем благодарны за любую помощь.
РЕДАКТИРОВАТЬ:
Похоже, что флаг requiredFeature
в AndroidManifest вызывает проблемы здесь.После удаления проверка разрешений работает как надо.Теперь я пытаюсь выяснить, как использовать разрешение телефона И поддерживать планшетные устройства, не поддерживающие эти функции.
РЕДАКТИРОВАТЬ 2:
Благодаря @Malv я узналчто корнем моей проблемы было необязательное разрешение READ_PHONE_STATE.Я провел некоторое исследование и выяснил, что для того, чтобы получить то, что я хочу, я должен заявить о разрешении по мере необходимости.Кроме того, если разрешение телефона должно быть дополнительной функцией (позволяющей планшетам также загружать приложение), я должен использовать дополнительный параметр, определяющий функцию телефонии как дополнительную.
Вот мой обновленный AndroidManifest:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-feature android:name="android.hardware.telephony" android:required="false" />