因为项目需要用到精确打卡,所以一两秒就要更新一次经纬度,uni-app 按照官方接了离线安卓高德sdk(链接:高德sdk 离线链接) 用 uni.getLocation 获取到的经纬度是蛮准的,有六位小数,但是拿着手机走一段距离,居然要二三十秒才会变经纬度(吐了)
用了多个手机测试也是一样,最后想到了 用uni-app 直接调用安卓 高德sdk 直接获取经纬度
下面直接贴目录结构和代码了,(前提是你按照上面 高德sdk离线链接步骤引入 arr包)
1:在下图目录 创建你的java class
下面是我的代码。com.example.myapplication 为我的安卓包名,你们要改为自己的包名
我的代码参考的是 高德定位数据
package com.example.myapplication;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationListener;
import android.util.Log;
import static io.dcloud.common.util.ReflectUtils.getApplicationContext;
public class LocationMy{
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
// 这个方法初始化一次就行了
public void startMy() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
mLocationOption = new AMapLocationClientOption();
//设置定位模式为AMapLocationMode.Battery_Saving,高精度模式。
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
mLocationOption.setInterval(1000);
//单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
mLocationOption.setHttpTimeOut(20000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
Log.e("aaa","aaaa");
}
// 返回当前位置的经纬度
static double lng = 1.1;
static double lat = 1.1;
public double rLng(){
return lng;
}
public double rLat(){
return lat;
}
//声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener(){
public void onLocationChanged(AMapLocation amapLocation) {
Log.e("take","caijielong");
// TODO Auto-generated method stub
if (amapLocation != null) {
int mycode = amapLocation.getErrorCode();
Log.e("myCode",String.valueOf(mycode));
if (amapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
double locationType = amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
double latitude = amapLocation.getLatitude();//获取纬度
double longitude = amapLocation.getLongitude();//获取纬度
Log.e("Amap==经度:纬度", "locationType:"+locationType+",latitude:"+latitude);
lat = latitude;
lng = longitude;
}else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
//todo mycode 为12时,为缺少定位权限,mycode要传到uni-app 提醒用户开启权限 具体错误码:https://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/
}
}
}
};
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
}
2: uni-app 前端调用
// com.example.myapplication 为安卓包名,LocationMy 为java class名
var LocationMy = plus.android.importClass("com.example.myapplication.LocationMy")
var LocationMy = new LocationMy();
LocationMy.startMy(); // 这个方法一定要执行一次就行了
//下面两个即为 安卓 高德sdk的经纬度
LocationMy.rLng();
LocationMy.rLat();
调用成功 end~ 隔一秒输出经纬度 nice
有不懂的可以底下评论问我,一起研究~~