Как запросить разрешение на местоположение устройства Android в React Native во время выполнения?

Я пытался использовать геолокацию React Native для приложения для Android. Плохо документированный модуль находится здесь https://facebook.github.io/react-native/docs/geolocation.html. Согласно документации, вы обрабатываете разрешения местоположения на Android, используя следующий код в AndroidManifest.xml-файл

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

однако мои онлайн-исследования показывают, что вышеуказанная строка кода бесполезна для версий ANDROID >= 6.0

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

Как я могу успешно запросить разрешение местоположения во время выполнения для React Native Android App ? Заранее спасибо !

4 ответов


это не сработало для меня

if (granted === PermissionsAndroid.RESULTS.GRANTED) {
}

Я сослался на https://facebook.github.io/react-native/docs/permissionsandroid.html#request и check () возвращает логическое

const granted = await PermissionsAndroid.check( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION );

if (granted) {
  console.log( "You can use the ACCESS_FINE_LOCATION" )
} 
else {
  console.log( "ACCESS_FINE_LOCATION permission denied" )
}

Я решил это, изменив targetSdkVersion (то же самое для compileSdkVersion, в моем случае 23) в android/app/build.градля.

Редактировать AndroidManifest.xml расположен в android / src / main и добавьте

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

//следующий :

 import { PermissionsAndroid } from 'react-native';

//и затем добавьте этот метод:

export async function requestCameraPermission() 
{
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
      {
        'title': 'Example App',
        'message': 'Example App access to your location '
      }
    )
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      console.log("You can use the location")
      alert("You can use the location");
    } else {
      console.log("location permission denied")
      alert("Location permission denied");
    }
  } catch (err) {
    console.warn(err)
  }
}

//и получить доступ к методу при запросе местоположения во время выполнения

   async componentWillMount() {
    await requestCameraPermission()
    }

вы можете использовать React native PermissionsAndroid для запроса разрешения:https://facebook.github.io/react-native/docs/permissionsandroid.html#request

или более простой вариант будет использовать библиотеку, которая делает это за вас, например https://github.com/yonahforst/react-native-permissions


Я заметил две вещи:

  1. вы должны изменить compileSdkVersion 23 на
  2. вы должны добавить просмотр нажмите прослушиватель показать в диалоговом окне.

пример кода:

import React, { Component } from 'react';
import { Text, PermissionsAndroid, Alert } from 'react-native';

export default class RuntimePermissionSample extends React.Component {

    constructor(props) {
        super(props);
    }

    async requestLocationPermission() {
        const chckLocationPermission = PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION);
        if (chckLocationPermission === PermissionsAndroid.RESULTS.GRANTED) {
            alert("You've access for the location");
        } else {
            try {
                const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
                    {
                        'title': 'Cool Location App required Location permission',
                        'message': 'We required Location permission in order to get device location ' +
                            'Please grant us.'
                    }
                )
                if (granted === PermissionsAndroid.RESULTS.GRANTED) {
                    alert("You've access for the location");
                } else {
                    alert("You don't have access for the location");
                }
            } catch (err) {
                alert(err)
            }
        }
    };

    render() {
        return (
            <Text
                onPress={() => this.requestLocationPermission()}>
                Request Location Permission
            </Text>
        )
    }
}

надеюсь, это поможет вам.