因为项目需要用到精确打卡,所以一两秒就要更新一次经纬度,uni-app 按照官方接了离线安卓高德sdk(链接:高德sdk 离线链接) 用 uni.getLocation 获取到的经纬度是蛮准的,有六位小数,但是拿着手机走一段距离,居然要二三十秒才会变经纬度(吐了)

用了多个手机测试也是一样,最后想到了 用uni-app 直接调用安卓 高德sdk 直接获取经纬度

 

下面直接贴目录结构和代码了,(前提是你按照上面 高德sdk离线链接步骤引入 arr包)

1:在下图目录 创建你的java class

Android经纬度获取判断 app获取经纬度_Android经纬度获取判断

 

下面是我的代码。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

有不懂的可以底下评论问我,一起研究~~