Unity Android 接入高德定位SDK

时间:2025-01-25 09:22:07

Unity版本 2020

第一步首先去高德开放平台注册账号然后申请Key

高德开放平台 | 高德地图API

注册好账号之后 点击控制台 然后选择管理key 新建一个应用 

 选择添加  然后创建一个key 选择Android平台  SHA1码获取方式参考我的另一篇博客

Android 签名文件.keystore转换.jks_小张不爱写代码的博客-****博客_keystore转jks

 然后直接创建key即可

创建完毕之后去下载定位SDK

相关下载-Android 定位SDK | 高德地图API

打开Unity创建一个Unity项目

并创建如下脚本

using UnityEngine;
using ;

public class Sdk : MonoBehaviour
{
    public Text t;
    private AndroidJavaClass jc;
    private AndroidJavaObject jo;
    private void Awake()
    {
        if ( == )
        {
            jc = new AndroidJavaClass("com.");
            jo = <AndroidJavaObject>("currentActivity");
        }
    }

    public void StartAMap()
    {
        switch ()
        {
            case :
                ("StartAMap");
                break;
            default:
                StopAMapCallBack();
                break;
        }
    }

    public void StopAMap()
    {
        switch ()
        {
            case :
                ("StopAMap");
                break;
            default:
                break;
        }
    }
    public void StartAMapCallBack(string msg)
    {
         = msg;
    }

    public void StopAMapCallBack()
    {
         = "1111";
    }
}

然后创建如下结构 Button点击事件分别指向StartAMap和StopAMap即可

 然后直接出包导出AndroidStudio项目

导出完成之后 现在AS工程中的Libs文件夹中放入解压的高德SDK jar包

 导入之后在如图位置写入如下代码

implementation fileTree(dir: 'libs', include: ['*.jar'])

在上面写入如下权限

  <!--用于进行网络定位-->
  <uses-permission android:name=".ACCESS_COARSE_LOCATION" />
  <!--用于访问GPS定位-->
  <uses-permission android:name=".ACCESS_FINE_LOCATION" />
  <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
  <uses-permission android:name=".ACCESS_NETWORK_STATE" />
  <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
  <uses-permission android:name=".ACCESS_WIFI_STATE" />
  <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
  <uses-permission android:name=".CHANGE_WIFI_STATE" />
  <!--用于访问网络,网络定位需要上网-->
  <uses-permission android:name="" />
  <!--用于读取手机当前的状态-->
  <uses-permission android:name=".READ_PHONE_STATE" />
  <!--用于写入缓存数据到扩展存储卡-->
  <uses-permission android:name=".WRITE_EXTERNAL_STORAGE"
      tools:ignore="ScopedStorage" />
  <!--用于申请调用A-GPS模块-->
  <uses-permission android:name=".ACCESS_LOCATION_EXTRA_COMMANDS" />
  <!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
  <uses-permission android:name=".FOREGROUND_SERVICE"/>
  <!--如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明-->
  <uses-permission android:name=".ACCESS_BACKGROUND_LOCATION"/>

  <uses-permission android:name=".WRITE_EXTERNAL_STORAGE"
      tools:ignore="ScopedStorage" />

在的Application节点内写入如下内容

  <meta-data
     android:name="."
     android:value="6c8580a005a4f6d162f59e17ace1fbca" />
  <service android:name="" />

打开UnityPlayerActivity脚本 在末尾加入如下代码 用以动态申请权限

//权限管理
private static final String[] PERMISSIONS =
{
    ,
    .ACCESS_COARSE_LOCATION,
    .ACCESS_FINE_LOCATION,
    .ACCESS_NETWORK_STATE,
    .ACCESS_WIFI_STATE,
    .CHANGE_WIFI_STATE,
    .READ_PHONE_STATE,
    .ACCESS_LOCATION_EXTRA_COMMANDS,
    ,
    .BLUETOOTH_ADMIN,
};
private static final int PERMISSIONS_CODE = 1;
//申请权限
private void requestPermission()
{
    // 当API大于 23 时,才动态申请权限
    if (.SDK_INT >= Build.VERSION_CODES.M)
    {
        (this,PERMISSIONS,PERMISSIONS_CODE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    (requestCode, permissions, grantResults);
    switch (requestCode) {
        case PERMISSIONS_CODE:
            //权限请求失败
            for(int i=0;i<-1;i++)
            {
                if(grantResults[i] != PackageManager.PERMISSION_GRANTED)
                {
                    ("Permissions", "onRequestPermissionsResult: 权限请求失败:"+permissions[i].toString());
                }
            }
            break;
    }
}

然后在UnityPlayerActivity脚本中的OnCreate方法中调用requestPermission方法来申请权限

新创建一个类 写入如下代码

package com.;
import ;
import ;
import ;
import ;
import ;
import com.;
import com.;

public class GaoDe {
    private static GaoDe instance = null;
    private static UnityPlayerActivity ccActivity = null;

    public static GaoDe Ins() {
        if (instance == null) {
            instance = new GaoDe();
        }
        return instance;
    }
    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明定位回调监听器
    public AMapLocationListener mLocationListener = null;
    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;

    public void Init(UnityPlayerActivity act){
        ccActivity =  act;
        //初始化定位
        (ccActivity, true, true);
        (ccActivity, true);
        try {
            //初始化定位
            mLocationClient = new AMapLocationClient(ccActivity);
        }catch (Exception e){
            ();
            ("Unity", "UnityPlayerActivity Init error: "+e);
        }
        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        //设置定位监听
        mLocationListener = new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation aMapLocation) {
                OnLocationChanged(aMapLocation);
            }
        };
        //设置定位回调监听
        (mLocationListener);
        //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
        (.Hight_Accuracy);
        //设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。
        (1000);
        //单位是毫秒,默认30000毫秒,建议超时时间不要低于8000毫秒。
        (8000);
        //优先使用gps
        (true);
        ("Unity", "高德: InitOK");
    }

    private void OnLocationChanged(AMapLocation amapLocation){
        ("Unity", "高德: OnLocationChanged");
        if(amapLocation == null) {
            amapLocation = ();
        }
        if (amapLocation != null)
        {
            ("AmapError", "amapLocation~=null start:");
            ();
            int errorCode = ();
            ("AmapError", "amapLocation~=null errorCode:"+errorCode);
            //定位成功回调信息,设置相关消息
            int locationType = ();//获取当前定位结果来源,如网络定位结果,详见定位类型表
            double longitude = ();//获取经度
            double latitude = ();//获取纬度
            String address = ();
            String country = ();
            String province = ();
            String city = ();
            String district = ();
            String re = errorCode + "|" + longitude + "|" + latitude + "|" + address +"|"+ country +"|"+ province +"|"+ city +"|"+ district+"  errrrrrrr";
            ("AmapError", "amapLocation~=null 位置信息:"+re);
            ("Main Camera", "StartAMapCallBack", re);
        }
        else
        {
            //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
            ("AmapError","location Error, ErrCode:"
                    + () + ", errInfo:"
                    + ());
            ();
            ("Main Camera", "StartAMapCallBack", "0|0|0");
        }
    }

    //开始定位
    public void StartAMap()
    {
        if(mLocationClient!=null) {
            //给定位客户端对象设置定位参数
            (mLocationOption);
            //启动定位
            ();
            ("Unity", "StartAMap: 已开启定位");
        }
        else{
            if(ccActivity!=null)
                Init(ccActivity);
            else
                ("Unity", "StartAMap: mLocationClient是空的");
        }
    }

    //停止定位
    public void StopAMap()
    {
        if(mLocationClient!=null) {
            ();
            ();
            mLocationOption = null;
            mLocationListener = null;
            ("Main Camera", "StopAMapCallBack","");
        }
    }
}

打开UnityPlayerActivity脚本在最末尾加入如下代码 在OnCreate申请权限下面调用

().Init(this); 用以初始化SDK

public void StartAMap(){
    ().StartAMap();
}

public void StopAMap()
{
    ().StopAMap();
}

然后就可以打包apk进行测试了  出现如下结果即可