unity对接安卓高德地图定位及围栏功能的实现(1)

1、首先去高德地图开放平台(游戏行业解决方案 | 高德地图API)。

注册自己的账号,并且创建自己的项目,按照高德官方的教程文档创建好项目及key。

2、下载定位SDK

SDK下载安卓版

3、安卓android studio开发

3.1新建一个android studio空项目


一切保持默认状态或者自己定义名字什么的也行,一直点击next就行了


按图选择并点击next


保持默认就行,或者自定义一些内容也行,点击finish

3.2新建一个要与unity交互的module

在创建的新Android studio中按图新建一个module



按照上图选择并点击next


finish



我创建的module名字

3.3配置与高德地图和unity交互必用的jar文件


将下载好的高德SDK包解压,找到上面的AMap_Location_V4.5.0.........jar,和unity的jar包classes.jar复制放入指定的位置libs文件夹下

untiy jar包classes.jar位置:(自己的unity安装的路径D:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes)


3.4创建与unity交互用的安卓脚本activity


操作平台切换到Android


右键选这个文件夹


在这个文件夹新建一个empty activity


自定义名字 ————finish

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文件


等待build完成



按照上图操作然后把红框内的其他文件复制到unity中


此时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>





©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容