Необязательное, опасное разрешение READ_PHONE_STATE не предоставляется на Android 8 и 9? - PullRequest
0 голосов
/ 12 февраля 2019

В моем приложении я хочу проверить, получает ли пользователь телефонный звонок (нет необходимости получать какие-либо данные о телефоне, например номер телефона).Поэтому я хочу получить доступ к опасному рейтингу разрешения 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" />

1 Ответ

0 голосов
/ 12 февраля 2019

Поскольку вам нужно это разрешение, вам нужно удалить android:requiredFeature="false".Вы просто хотите спросить пользователя, разрешить ли использование разрешения или запретить его.

Согласно документации :

Когда вы объявляете android:required="false" дляособенность, это означает, что приложение предпочитает использовать эту функцию, если она имеется на устройстве, но она предназначена для работы без указанной функции, если необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...