Как запросить разрешение для местоположения устройства Android в React Native во время выполнения?
Я пытаюсь использовать React Native GeoLocalisation для 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
Поскольку моя реализация GeoLocation в настоящее время не работает, у меня нет другой причины, кроме как полагать, что разрешения на размещение неправильно обрабатываются.
Как я могу успешно запросить разрешение на размещение во время выполнения приложения React Native Android? Заранее спасибо !
Ответы
Ответ 1
Это не сработало для меня
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" )
}
Ответ 2
Я решил это, изменив targetSdkVersion (то же самое, что compileSdkVersion, в моем случае 23) в android/app/build.gradle.
Отредактируйте файл 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 requestLocationPermission()
{
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 requestLocationPermission()
}
Ответ 3
Вы можете использовать ответные разрешения PermissionsAndroid для запроса разрешения: https://facebook.github.io/react-native/docs/permissionsandroid.html#request
Или более простой вариант будет использовать библиотеку, которая сделает это за вас, например https://github.com/yonahforst/react-native-permissions
Ответ 4
Вы можете запросить разрешение на местоположение, используя следующий код
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
alert("You can use the location")
} else {
alert("Location permission denied")
}
} catch (err) {
console.warn(err)
}
alert('hi');
Ответ 5
Это сработало для меня
async requestCameraPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
this.props.navigation.navigate("MapScreen")
} else {
alert("Camera permission denied")
}
} catch (err) {
console.warn(err)
}
}
Ответ 6
Я заметил две вещи:
- Вы должны сменить
compileSdkVersion 23
в файле build.gradle
- Вы должны добавить своего зрителя для просмотра кликов, чтобы отобразить диалоговое окно "Разрешение".
Образец кода:
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>
)
}
}
Надеюсь, это поможет вам.