React Native 版本 .apk 在更高版本的 android 设备中崩溃,地理定位权限被拒绝错误

Posted

技术标签:

【中文标题】React Native 版本 .apk 在更高版本的 android 设备中崩溃,地理定位权限被拒绝错误【英文标题】:Reack Native release .apk crashes in higher version of android devices with geolocation permission denied error 【发布时间】:2019-03-08 02:44:39 【问题描述】:

我创建了一个简单的应用程序,它有一个登录页面,当用户点击登录按钮时,它会导航到另一个页面。每当我使用 react-native run-android 运行我的应用程序时,它都可以正常工作。但是,每当我在更高版本的 Android 设备中运行 .apk 文件时,应用程序就会崩溃(它在 android 5 和 6 中运行良好)。

package.json


    "name": "awsUpload",
    "version": "0.0.1",
    "private": true,
    "scripts": 
        "start": "node node_modules/react-native/local-cli/cli.js start",
        "test": "jest"
    ,
    "dependencies": 
        "aws-sdk": "^2.395.0",
        "link": "^0.1.5",
        "react": "16.6.3",
        "react-native": "^0.58.3",
        "react-native-aws3": "0.0.8",
        "react-native-device-info": "^0.26.2",
        "react-native-file-upload": "^1.0.4",
        "react-native-image-picker": "^0.28.0",
        "react-native-material-dropdown": "^0.11.1",
        "react-native-router-flux": "^4.0.6",
        "uniqid": "^5.0.3"
    ,
    "devDependencies": 
        "babel-core": "7.0.0-bridge.0",
        "babel-jest": "24.0.0",
        "jest": "24.0.0",
        "metro-react-native-babel-preset": "0.51.1",
        "react-test-renderer": "16.6.3"
    ,
    "jest": 
        "preset": "react-native"
    

我正在使用下面的代码来获取地理位置。据我所知,由于受到保护,在更高版本的 Android 设备中获取地理位置已经存在问题,并且存在堆栈溢出的解决方案。但是我不知道如何使用它。

我的代码是,

import React, Component from 'react';
import Text, View from 'react-native';

export default class App extends Component<Props> 

       constructor(props) 
        super(props);
        this.state = 

          currentLongitude: 'unknown',//Initial Longitude
          currentLatitude: 'unknown',//Initial Latitude

        
      
    componentDidMount = () => 
        navigator.geolocation.getCurrentPosition(
          //Will give you the current location
           (position) => 
              const currentLongitude = JSON.stringify(position.coords.longitude);
              //getting the Longitude from the location json
              const currentLatitude = JSON.stringify(position.coords.latitude);
              //getting the Latitude from the location json
              this.setState( currentLongitude:currentLongitude );
              //Setting state Longitude to re re-render the Longitude Text
              this.setState( currentLatitude:currentLatitude );
              //Setting state Latitude to re re-render the Longitude Text
           ,
           (error) => alert(error.message),
            enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 
        );
        this.watchID = navigator.geolocation.watchPosition((position) => 
          //Will give you the location on location change
            console.log(position);
            const currentLongitude = JSON.stringify(position.coords.longitude);
            //getting the Longitude from the location json
            const currentLatitude = JSON.stringify(position.coords.latitude);
            //getting the Latitude from the location json
           this.setState( currentLongitude:currentLongitude );
           //Setting state Longitude to re re-render the Longitude Text
           this.setState( currentLatitude:currentLatitude );
           //Setting state Latitude to re re-render the Longitude Text
        );
    
   componentWillUnmount = () => 
      navigator.geolocation.clearWatch(this.watchID);

   
    render() 
      return (
                <View>
                   <Text>Longitude: this.state.currentLongitude</Text>
                   <Text>Latitude: this.state.currentLatitude</Text>

                   this.state.error ? <Text>Error: this.state.error</Text> : null
                </View> 
          );
        
      

解决方案链接是,

https://***.com/questions/33865445/gps-location-provider-requires-access-fine-location-permission-for-android-6-0/33866959 

【问题讨论】:

尝试在更高版本的模拟器中运行,看看log cat logs 【参考方案1】:

错误完全清楚,您需要获得访问位置的权限。

有两种类型的权限:

1- 仅通过向manifest.xml 添加权限即可授予的权限

2- 用户本人必须接受该权限。(这些通常显示在 dialog 中,并要求用户授予应用访问权限...)。

位置权限是第二种。所以将该权限添加到Manifest.xml 不会做任何事情。

您可以查看https://facebook.github.io/react-native/docs/permissionsandroid中的权限列表

下面的链接解释了请求用户许可的方式:

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

【讨论】:

我发现,我的 .apk 崩溃了,因为我正在获取用户位置。如何解决? 您提供的信息还不够!请给一些代码或堆栈跟踪 你是用android studio调试的吗? 我需要添加该权限 MainActivity.java 文件。我对如何添加它感到困惑。 我编辑了我的答案。如果您正在使用 react-native 进行编码,则无需在 MainActivity.java 中编写代码,希望对您有所帮助

以上是关于React Native 版本 .apk 在更高版本的 android 设备中崩溃,地理定位权限被拒绝错误的主要内容,如果未能解决你的问题,请参考以下文章

React Native Maps - 自定义标记图像未在更高的 Android 版本中呈现

是否可以在 react native 中获取 apk 包名称和版本代码?

React-native APK打包

react-native打包apk常见错误收集

navigator.geolocation.getCurrentPosition 在 React Native 版本(0.60)及更高版本中不起作用,如何获取位置?

安卓转战React-Native之签名打包成Apk并极速多渠道打包