Проверка разрешений всегда возвращает "отказано". React Native - PullRequest
0 голосов
/ 14 июля 2020

В процессе отладки приложения React Native на физическом устройстве (Android), когда я проверяю разрешение на определение местоположения, оно всегда блокируется, даже если я предоставил разрешение в настройках. Я должен отметить, что раньше мне не удавалось запросить окно «запросить разрешение», поэтому я не мог заблокировать его каким-либо образом. Кроме того, я попытался удалить и снова установить приложение.

Вот код, в котором я проверяю разрешение на определение местоположения (я пробовал и другие). Здесь я использую react-native-permissions, однако поведение будет таким же, если я использую PermissionsAndroid из react-native.

import {check, PERMISSIONS, request, RESULTS, openSettings} from "react-native-permissions";

async function checkPermissions() {
    let response = await check(PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION); // <-- always blocked
    let isPermissionsGranted = false;

    if (response === RESULTS.GRANTED) {
        isPermissionsGranted = true;
    } else if (response === RESULTS.DENIED) {
        response = request(PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION, {
            title: "FreeLine requires permission",
            message: "FreeLine needs access to your location so you can see your position",
            buttonPositive: "Ok",
            buttonNegative: "Don't show my position",
        });

        if (response === RESULTS.GRANTED) {
            isPermissionsGranted = true;
        } else if (response === RESULTS.DENIED) {
            await openSettings();
        }
    }

    return isPermissionsGranted;
}

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

1 Ответ

1 голос
/ 16 июля 2020

В итоге обнаружил root проблемы. Самое смешное, что это никак не связано с моим кодом. Проблема была вызвана манифестом, а точнее правилами, которые я включил.

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<uses-feature android:name="android.permission.BLUETOOTH" android:required="true"/>
<!-- Only foreground ble access -->
<uses-feature android:name="android.permission.ACCESS_FINE_LOCATION" android:required="true"/>

Как видно из приведенного выше фрагмента, я использовал use-feature. Вот что об этом говорится в документации:

Google Play использует элементы, объявленные в манифесте вашего приложения, чтобы отфильтровать ваше приложение от устройств, которые не соответствуют его требованиям к аппаратным и программным функциям.

В дополнение к правилам выше я должен добавить uses-permission, вот так:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...