1、首先去高德地图开放平台(游戏行业解决方案 | 高德地图API)。
注册自己的账号,并且创建自己的项目,按照高德官方的教程文档创建好项目及key。
2、下载定位SDK
3、安卓android studio开发
3.1新建一个android studio空项目
3.2新建一个要与unity交互的module
3.3配置与高德地图和unity交互必用的jar文件
untiy jar包classes.jar位置:(自己的unity安装的路径D:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes)
3.4创建与unity交互用的安卓脚本activity
3.5直接上activity脚本内容
package com.YY.gaodetest;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
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.AMapLocationClientOption.AMapLocationProtocol;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.AMapLocationQualityReport;
import java.text.SimpleDateFormat;
import java.util.Date;
public class UnityGaodeActivityextends UnityPlayerActivity
{
private AMapLocationClientlocationClient =null;
private AMapLocationClientOptionlocationOption =null;
private StringLocationInfo;
//经度
private StringLongitude;
//纬度
private StringLatitude;
//时间戳
private Stringtimeer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initLocation();
}
//unity获取定位的信息方法
public void GetInfo()
{
startLocation();
}
//初始化定位
private void initLocation(){
//初始化client
locationClient =new AMapLocationClient(this.getApplicationContext());
locationOption = getDefaultOption();
//设置定位参数
locationClient.setLocationOption(locationOption);
// 设置定位监听
locationClient.setLocationListener(locationListener);
}
/**
* 默认的定位参数
*/
private AMapLocationClientOptiongetDefaultOption(){
AMapLocationClientOption mOption =new AMapLocationClientOption();
mOption.setLocationMode(AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
AMapLocationClientOption.setLocationProtocol(AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);//可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言)
return mOption;
}
@Override
protected void onDestroy() {
super.onDestroy();
destroyLocation();
}
/**
* 定位监听
*/
AMapLocationListenerlocationListener =new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (null != location) {
StringBuffer sb =new StringBuffer();
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
if(location.getErrorCode() ==0){
sb.append("定位成功" +"\n");
SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date =new Date(location.getTime());
String time=df.format(date);
sb.append("时间: " + time);
sb.append("定位类型: " + location.getLocationType() +"\n");
sb.append("经 度 : " + location.getLongitude() +"\n");
sb.append("纬 度 : " + location.getLatitude() +"\n");
sb.append("精 度 : " + location.getAccuracy() +"米" +"\n");
sb.append("提供者 : " + location.getProvider() +"\n");
sb.append("速 度 : " + location.getSpeed() +"米/秒" +"\n");
sb.append("角 度 : " + location.getBearing() +"\n");
// 获取当前提供定位服务的卫星个数
sb.append("星 数 : " + location.getSatellites() +"\n");
sb.append("国 家 : " + location.getCountry() +"\n");
sb.append("省 : " + location.getProvince() +"\n");
sb.append("市 : " + location.getCity() +"\n");
sb.append("城市编码 : " + location.getCityCode() +"\n");
sb.append("区 : " + location.getDistrict() +"\n");
sb.append("区域 码 : " + location.getAdCode() +"\n");
sb.append("地 址 : " + location.getAddress() +"\n");
sb.append("兴趣点 : " + location.getPoiName() +"\n");
//定位完成的时间
// sb.append("定位时间: " + Utils.formatUTC(location.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n");
}else {
//定位失败
sb.append("定位失败" +"\n");
sb.append("错误码:" + location.getErrorCode() +"\n");
sb.append("错误信息:" + location.getErrorInfo() +"\n");
sb.append("错误描述:" + location.getLocationDetail() +"\n");
}
sb.append("***定位质量报告***").append("\n");
sb.append("* WIFI开关:").append(location.getLocationQualityReport().isWifiAble() ?"开启":"关闭").append("\n");
sb.append("* GPS状态:").append(getGPSStatusString(location.getLocationQualityReport().getGPSStatus())).append("\n");
sb.append("* GPS星数:").append(location.getLocationQualityReport().getGPSSatellites()).append("\n");
sb.append("* 网络类型:" + location.getLocationQualityReport().getNetworkType()).append("\n");
sb.append("* 网络耗时:" + location.getLocationQualityReport().getNetUseTime()).append("\n");
sb.append("****************").append("\n");
//定位之后的回调时间
SimpleDateFormat currentTine =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 =new Date(location.getTime());
String time1=currentTine.format(date1);
sb.append("回调时间: " + time1);
// sb.append("回调时间: " + Utils.formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n");
//解析定位结果,
LocationInfo = sb.toString();
Longitude= String.valueOf(location.getLongitude());
Latitude= String.valueOf(location.getLatitude());
timeer= String.valueOf(location.getTime());
String a=Longitude+","+Latitude+","+timeer+","+LocationInfo;
//给unity发送定位成功后解析的定位结果,这个方法的使用请自行百度
UnityPlayer.UnitySendMessage("Driver","checkFenca",a);
}else {
LocationInfo="定位失败,loc is null";
}
}
};
private StringgetGPSStatusString(int statusCode){
String str ="";
switch (statusCode){
case AMapLocationQualityReport.GPS_STATUS_OK:
str ="GPS状态正常";
break;
case AMapLocationQualityReport.GPS_STATUS_NOGPSPROVIDER:
str ="手机中没有GPS Provider,无法进行GPS定位";
break;
case AMapLocationQualityReport.GPS_STATUS_OFF:
str ="GPS关闭,建议开启GPS,提高定位质量";
break;
case AMapLocationQualityReport.GPS_STATUS_MODE_SAVING:
str ="选择的定位模式中不包含GPS定位,建议选择包含GPS定位的模式,提高定位质量";
break;
case AMapLocationQualityReport.GPS_STATUS_NOGPSPERMISSION:
str ="没有GPS定位权限,建议开启gps定位权限";
break;
}
return str;
}
/**
* 开始定位
*
*/
private void startLocation(){
// 设置定位参数
locationClient.setLocationOption(locationOption);
// 启动定位
locationClient.startLocation();
}
private void stopLocation(){
// 停止定位
locationClient.stopLocation();
}
/**
* 销毁定位
*/
private void destroyLocation(){
if (null !=locationClient) {
/**
* 如果AMapLocationClient是在当前Activity实例化的,
* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
*/
locationClient.onDestroy();
locationClient =null;
locationOption =null;
}
}
}
3.6打包Android module文件
按照上图操作然后把红框内的其他文件复制到unity中
AndroidManifest.xml文件是安卓接sdk必备文件,配置按照高德官方的配置,具体解释请百度
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
package="(这个是包名:安卓工程和unity打包的包名要一致,这个括号的文字复制到xml文件后要删除)"
platformBuildVersionCode="23"
platformBuildVersionName="6.0-2438415">
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<!-- 请求网络 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 不是SDK需要的权限,是示例中的后台唤醒定位需要的权限 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- 需要运行时注册的权限 -->
<!--用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--用于提高GPS定位速度-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--读取缓存数据-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 更改设置 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 3.2.0版本增加 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 3.2.0版本增加-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<application android:banner="@drawable/app_banner"
android:debuggable="false"
android:icon="@drawable/app_icon"
android:isGame="true"
android:label="@string/app_name"
android:theme="@style/UnityThemeSelector">
<!-- 设置key值 -->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="(申请的高德地图的key)" />
<!-- 定位需要的服务 -->
<service android:name="com.amap.api.location.APSService" ></service>
<activity android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:label="@string/app_name" android:launchMode="singleTask" android:name=".UnityGaodeActivity(android与unity交互的Activity,配置后删除此括号内容)" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
</activity>
</application>
</manifest>