背景

最近在做项目ReactNative项目时需要获取手机的经纬度,刚开始直接使用浏览器的原生方法:navigator.geolocation.getCurrentPosition,在ios手机运行正常,但是在Android部分机型上面会超时。

分析

1,因为ios6以后系统用的都是高德定位服务,而Android手机系统用的是Google定位服务,而且国内手机厂商对操作系统做了不同的定制,在国内基本不支持Google定位服务
2,既然浏览器原生的定位方法在Android机行不通,那能否用ReactNative专门的定位API Geolocation呢?事实证明这个也是行不通的,底层调的也是Google定位服务
3,在native部分移植高德sdk,然后手动暴露接口给ReactNative调用,理论可行,但是复杂度比较高,作为备选方案
4,尝试ReactNative关于高德定位服务插件react-native-amap-geolocation

实现

插件安装:

npm istall react-native-amap-geolocation --save
react-native link react-native-amap-geolocation

JS部分:

import { Geolocation, init } from "react-native-amap-geolocation";export default class ClockedInList extends React.Component {async geolocationInit() {if (Platform.OS === "android") {const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION);if (granted === PermissionsAndroid.RESULTS.GRANTED) {//设置高德keyawait init({// ios: "9bd6c82e77583020a73ef1af59d0c759",android: "b53dcb22e8061d27116422b82123bae2"   // 传入AMAP_KEY});this.requestFetchGetList();}} else {this.requestFetchGetList();}
};componentDidMount() {this.geolocationInit();
}requestFetchGetList() {if (Platform.OS === "android") {return new Promise(() => {Geolocation.getCurrentPosition(location => {let getCoordinate = wgs84togcj02(location.coords.longitude, location.coords.latitude);const { pageNum, strName } = this.state;let params = {pageSize: 10,strName,pageNum,lon: getCoordinate[0],lat: getCoordinate[1]}queryStrList(params).then((res) => {if (+res.success === 1) {this.arr.push(res.result.pageResult.list)this.setState({pageNum,pages: res.result.pageResult.pages})}})},(error) => this.setState({ error: error.message }, alert(error.message)),{ enableHighAccuracy: true, timeout: 10000, maximumAge: 10000 },);})} else {return new Promise(() => {navigator.geolocation.getCurrentPosition(location => {let getCoordinate = wgs84togcj02(location.coords.longitude, location.coords.latitude);const { pageNum, strName } = this.state;let params = {pageSize: 10,strName,pageNum,lon: getCoordinate[0],lat: getCoordinate[1]}queryStrList(params).then((res) => {if (+res.success === 1) {this.arr.push(res.result.pageResult.list)this.setState({pageNum,pages: res.result.pageResult.pages})}})},(error) => this.setState({ error: error.message }, alert(error.message)),{ enableHighAccuracy: true, timeout: 10000, maximumAge: 10000 },);})}
}

因为服务调用要在初始化之前完成,所以PermissionsAndroid.request和init函数前面添加await

Native部分在MainApplication引入AMapGeolocationPackage,什么都不用动

AMAP_KEY是在高德官网上针对应用申请的key,申请过程详见官网:https://lbs.amap.com/api/android-location-sdk/guide/create-project/get-key

我遇到的一个坑就是有个同事改变了应用的keystore,但是我还是用Android Studio默认的debug.keystore去获取SHA1,导致key值不对,这里跟大家推荐一个好用的apk:Gen_Signature_Android.apk,输入应用程序包名就可以得到证书指纹的MD5值,可以确认自己使用的keystore是否是同一个。例如
证书指纹:
MD5: 0C:1E:2F:37:D4:23:6C:5E:7C:2B:E2:EF:60:81:15:E9
SHA1: 69:45:BF:12:D4:DB:0C:4F:BB:29:14:02:8B:78:F5:25:7C:BD:06:CE
SHA256: 1E:9C:7F:7F:72:B2:16:3C:66:F4:05:54:D3:A9:C9:7F:4A:83:C5:A3:99:B6:27:06:0F:12:F6:C7:5B:22:79:8C

结论

运用插件react-native-amap-geolocation可以完美解决ReactNative在Android手机的定位问题,获取到的经纬度和Android原生集成高德sdk获取到的相同,因为两者的定位服务是相同的:AMapLocationClient

ReactNative运用插件react-native-amap-geolocation获取Android手机高德经纬度相关推荐

  1. [RN] React Native 键盘管理 在Android TextInput遮盖,上移等问题解决办法

    [RN] React Native 键盘管理 在Android TextInput遮盖,上移等问题解决办法 参考文章: (1)[RN] React Native 键盘管理 在Android TextI ...

  2. 获取Android手机的分辨率通过ADB命令

    获取Android手机的分辨率通过ADB命令 adb shell dumpsys window displays//此命令即可获取 WINDOW MANAGER DISPLAY CONTENTS (d ...

  3. 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址

    获取Android 手机设备信息:操作系统版本号.手机分辨率.运营商.当前联网方式.IMEI.MEID.MAC地址 包括双卡机型上的两个IMEI信息 /*** Created by Administr ...

  4. android每个程序的内存大小,如何获取Android手机全部内存和可用内存尺寸

    通过读取文件"/proc/meminfo"的信息能够获取手机Memory的总量,而通过ActivityManager.getMemoryInfo(ActivityManager.M ...

  5. Unity获取Android手机的RAM和剩余RAM和ROM

    Unity获取Android手机的RAM和剩余RAM和ROM 前言 一.Android工程方法的实现 二.生成aar 三.Untiy中的调用 前言 项目工作需要,在游戏APP运行时,获取当前手机的剩余 ...

  6. 获取Android手机总内存和可用内存

    在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小.这个该如何实现呢? 通过读取文件"/proc/meminfo"的信息能够获 ...

  7. android开发获取手机,通过ADB获取Android手机信息,获取手机信息

    通过ADB获取Android手机信息,获取手机信息 原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CP ...

  8. 获取Android手机MAC的一些方法

    获取Android手机MAC的一种实现方案,仅供参考,哈哈哈!是否还有其他更优的解决方法呢? 请注意,高版本在WiFi关闭时,获取不到MAC ` /** * 获取手机MAC: * @param con ...

  9. 通过adb命令获取Android手机的IP地址

    要获取Android手机的IP地址,必须先保证你的Android手机已经连接到无线网络(此处的无线网络包括WiFi和WAPI,不包括3G或2G的移动网络). 先执行命令"adb shell ...

  10. adb 查看屏幕大小_Android应用开发之adb命令如何获取android手机屏幕分辨率

    本文将带你了解Android应用开发之adb命令如何获取android手机屏幕分辨率,希望本文对大家学Android有所帮助 #### 1.   通用方法: adb shell dumpsys win ...

最新文章

  1. IDEA键盘突然失去响应
  2. flex图表数据动态更新效果示例
  3. 如何有效落地企业目标管理方法论?
  4. 想学python有什么用-Python为什么这么火?学习python有什么用?
  5. Interface继承至System.Object?
  6. linux下修改rm命令防止误删除
  7. 传递函数尾1法和首1法及具体举例+H(s)与H(z)在书中出现的目的
  8. 使用Nancy打造TaskManager2.0管理系统
  9. C++ 类访问控制(public/protected/private)
  10. Linux chmod
  11. arm架构和x86架构_ARM、X86和MIPS主流架构优缺点分析
  12. 考虑空气阻力的抛射体的matlab,考虑空气阻力的抛射体运动mtlab仿真
  13. a jquery 标签点击不跳转_jquery怎么让a标签不跳转?
  14. PC串行接口串口定义
  15. Speed Gear(变速精灵XP) V6.0 - 免费版,破解版,绿色版
  16. elasticsearch-7.15.2 配置IK中文分词器+拼音分词
  17. [I T]深圳唯冠天价律师费遭起诉 补偿金由法院暂管理
  18. 整理41个Python不同方面的练习题,希望对你有帮助
  19. 模态框-model dialog
  20. kafka动态权限认证(SASL SCRAM + ACL)

热门文章

  1. 计算某天是星期几-泽勒算法
  2. Gitbub认证及代码提交
  3. linux如何查看读写权限,Linux系统下如何查看及修改文件读写权限
  4. 三星android应用商店,三星应用商店(Galaxy Apps)
  5. 【网站排名软件】如何让网站关键词快速排名到首页
  6. 白盒测试-判定条件覆盖
  7. ubuntu ibus拼音异常
  8. 【disordered_zip】BUGKU
  9. 电脑键盘部分按键失灵_键盘失灵_电脑键盘失灵怎么办_电脑键盘失灵_笔记本键盘失灵怎么办-太平洋IT百科...
  10. 软件项目确立的几个步骤