ReactNative运用插件react-native-amap-geolocation获取Android手机高德经纬度
背景
最近在做项目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手机高德经纬度相关推荐
- [RN] React Native 键盘管理 在Android TextInput遮盖,上移等问题解决办法
[RN] React Native 键盘管理 在Android TextInput遮盖,上移等问题解决办法 参考文章: (1)[RN] React Native 键盘管理 在Android TextI ...
- 获取Android手机的分辨率通过ADB命令
获取Android手机的分辨率通过ADB命令 adb shell dumpsys window displays//此命令即可获取 WINDOW MANAGER DISPLAY CONTENTS (d ...
- 获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址
获取Android 手机设备信息:操作系统版本号.手机分辨率.运营商.当前联网方式.IMEI.MEID.MAC地址 包括双卡机型上的两个IMEI信息 /*** Created by Administr ...
- android每个程序的内存大小,如何获取Android手机全部内存和可用内存尺寸
通过读取文件"/proc/meminfo"的信息能够获取手机Memory的总量,而通过ActivityManager.getMemoryInfo(ActivityManager.M ...
- Unity获取Android手机的RAM和剩余RAM和ROM
Unity获取Android手机的RAM和剩余RAM和ROM 前言 一.Android工程方法的实现 二.生成aar 三.Untiy中的调用 前言 项目工作需要,在游戏APP运行时,获取当前手机的剩余 ...
- 获取Android手机总内存和可用内存
在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小.这个该如何实现呢? 通过读取文件"/proc/meminfo"的信息能够获 ...
- android开发获取手机,通过ADB获取Android手机信息,获取手机信息
通过ADB获取Android手机信息,获取手机信息 原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CP ...
- 获取Android手机MAC的一些方法
获取Android手机MAC的一种实现方案,仅供参考,哈哈哈!是否还有其他更优的解决方法呢? 请注意,高版本在WiFi关闭时,获取不到MAC ` /** * 获取手机MAC: * @param con ...
- 通过adb命令获取Android手机的IP地址
要获取Android手机的IP地址,必须先保证你的Android手机已经连接到无线网络(此处的无线网络包括WiFi和WAPI,不包括3G或2G的移动网络). 先执行命令"adb shell ...
- adb 查看屏幕大小_Android应用开发之adb命令如何获取android手机屏幕分辨率
本文将带你了解Android应用开发之adb命令如何获取android手机屏幕分辨率,希望本文对大家学Android有所帮助 #### 1. 通用方法: adb shell dumpsys win ...
最新文章
- IDEA键盘突然失去响应
- flex图表数据动态更新效果示例
- 如何有效落地企业目标管理方法论?
- 想学python有什么用-Python为什么这么火?学习python有什么用?
- Interface继承至System.Object?
- linux下修改rm命令防止误删除
- 传递函数尾1法和首1法及具体举例+H(s)与H(z)在书中出现的目的
- 使用Nancy打造TaskManager2.0管理系统
- C++ 类访问控制(public/protected/private)
- Linux chmod
- arm架构和x86架构_ARM、X86和MIPS主流架构优缺点分析
- 考虑空气阻力的抛射体的matlab,考虑空气阻力的抛射体运动mtlab仿真
- a jquery 标签点击不跳转_jquery怎么让a标签不跳转?
- PC串行接口串口定义
- Speed Gear(变速精灵XP) V6.0 - 免费版,破解版,绿色版
- elasticsearch-7.15.2 配置IK中文分词器+拼音分词
- [I T]深圳唯冠天价律师费遭起诉 补偿金由法院暂管理
- 整理41个Python不同方面的练习题,希望对你有帮助
- 模态框-model dialog
- kafka动态权限认证(SASL SCRAM + ACL)
热门文章
- 计算某天是星期几-泽勒算法
- Gitbub认证及代码提交
- linux如何查看读写权限,Linux系统下如何查看及修改文件读写权限
- 三星android应用商店,三星应用商店(Galaxy Apps)
- 【网站排名软件】如何让网站关键词快速排名到首页
- 白盒测试-判定条件覆盖
- ubuntu ibus拼音异常
- 【disordered_zip】BUGKU
- 电脑键盘部分按键失灵_键盘失灵_电脑键盘失灵怎么办_电脑键盘失灵_笔记本键盘失灵怎么办-太平洋IT百科...
- 软件项目确立的几个步骤