【问题标题】:How do I request permission for Android Device Location in React Native at run-time?如何在运行时在 React Native 中请求 Android 设备位置的权限?
【发布时间】:2018-01-31 00:23:50
【问题描述】:

我一直在尝试将 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 &gt;= 6.0 的版本没有用

由于我的 GeoLocation 实现当前无法正常工作,我没有其他理由相信位置权限没有得到正确处理。

如何在运行时为 React Native Android App 成功请求位置权限? 提前致谢!

【问题讨论】:

    标签: android react-native permissions geolocation


    【解决方案1】:

    我通过更改android/app/build.gradle 中的targetSdkVersion(与compileSdkVersion 相同,在我的情况下为23)解决了这个问题。

    编辑位于 android/src/main 中的 AndroidManifest.xml 并添加

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

    【讨论】:

    • 它对我不起作用,所以我只是从课堂上的任何地方删除了 await 关键字。它对我有用。
    【解决方案2】:

    这对我不起作用

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

    【讨论】:

      【解决方案3】:

      您可以使用 react native PermissionsAndroid 来请求权限:https://facebook.github.io/react-native/docs/permissionsandroid.html#request

      或者,更简单的选择是使用为您完成此任务的库,例如 https://github.com/yonahforst/react-native-permissions

      【讨论】:

      • 有什么方法可以请求“admin”权限以禁用应用程序的卸载?
      • 获得实际的实际管理员权限通常涉及生根或制造商 api。至少习惯了。
      • 您的链接丢失,请尝试修复它。
      【解决方案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】:

        我注意到两件事:

        1. 您必须在build.gradle 文件中更改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>
                )
            }
        }
        

        希望这会对你有所帮助。

        【讨论】:

          【解决方案6】:

          在清单中

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

          【讨论】:

          • 上述请求权限的方法很好,但是在应用上述方法之后,如果你无法看到权限对话框..然后再做一件事。在您当前的项目目录路径中运行此 cmd:“adb shell pm reset-permissions”这将重置您的所有权限,之后我可以看到权限对话框
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-02
          • 2017-03-01
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多