uni-app 呼叫安卓 高德sdk獲取經緯度(替代 uni.getLocation)

一起生個孩子發表於2020-10-13

因為專案需要用到精確打卡,所以一兩秒就要更新一次經緯度,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

有不懂的可以底下評論問我,一起研究~~

 

順便貼下   uni-app 呼叫安卓原生方法程式碼

相關文章