How do I request permission for Android Device Location in React Native at run-time?

前端 未结 6 1874
后悔当初
后悔当初 2020-12-09 15:47

I have been trying to use React Native \'s GeoLocalisation for an Android App. The poorly documentated module is found here https://facebook.github.io/react-native/docs/geol

相关标签:
6条回答
  • 2020-12-09 16:18

    in Manifest

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

    more details

    import {PermissionsAndroid} from 'react-native';
    
    async function requestCameraPermission() {
      try {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.CAMERA,
          {
            title: 'Cool Photo App Camera Permission',
            message:
              'Cool Photo App needs access to your camera ' +
              'so you can take awesome pictures.',
            buttonNeutral: 'Ask Me Later',
            buttonNegative: 'Cancel',
            buttonPositive: 'OK',
          },
        );
        if (granted === PermissionsAndroid.RESULTS.GRANTED) {
          console.log('You can use the camera');
        } else {
          console.log('Camera permission denied');
        }
      } catch (err) {
        console.warn(err);
      }
    }
    
    export default class AlertDetails extends Component{
    
        async componentDidMount() {
            await request_storage_runtime_permission()
        }
    }
    
    0 讨论(0)
  • 2020-12-09 16:23

    You can ask location permission using following code

    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');
    
    0 讨论(0)
  • 2020-12-09 16:23

    I've noticed two things:

    1. You have to change compileSdkVersion 23 in build.gradle file
    2. You have to add your View's click listener to display to Permission dialog.

    Sample code:

    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>
            )
        }
    }
    

    Hope this would help you.

    0 讨论(0)
  • 2020-12-09 16:25

    You could use the react native PermissionsAndroid to request the permission: https://facebook.github.io/react-native/docs/permissionsandroid.html#request

    Or, an easier option will be using a library that does it for you, such as https://github.com/yonahforst/react-native-permissions

    0 讨论(0)
  • 2020-12-09 16:36

    I solved it by changing the targetSdkVersion ( same to compileSdkVersion, in my case 23) in android/app/build.gradle.

    Edit AndroidManifest.xml located in android/src/main and add the

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

    next :

    import { PermissionsAndroid } from 'react-native';
    

    and then add this method:

    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)
      }
    }
    

    and access the method when you request the location at run-time

    async componentWillMount() {
        await requestLocationPermission()
    }
    
    0 讨论(0)
  • 2020-12-09 16:41

    This did not work for me

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

    I referred to https://facebook.github.io/react-native/docs/permissionsandroid.html#request and check() return a boolean

    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" )
    }
    
    0 讨论(0)
提交回复
热议问题