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进行测试了 出现如下结果即可