Unity接高德SDK(Android)

项目中需要定位两个玩家之间的距离并且显示每个玩家精确的位置,刚开始本想使用Unity自带的定位系统来进行定位,然后加上淘宝的IP定位来获取玩家的位置,但是由于淘宝的IP获取位置不够精确,因此使用高德安卓定位,这里记录一下:

首先介绍一下Unity自带的定位系统

 // 获取GPS定位 经纬度public IEnumerator GetGPS(Action<float, float> callback){//判断玩家是否启用位置服务if (!Input.location.isEnabledByUser)yield break;Input.location.Start(5, 5);int maxWait = 20;//等待获取位置while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0){yield return new WaitForSeconds(1);maxWait--;}if (maxWait < 1){Debug.LogError("GPS Start Timed out");yield break;}if (Input.location.status == LocationServiceStatus.Failed){Debug.LogError("GPS Unable to determine device location");yield break;}else{Debug.LogError("GPS Location: " + Input.location.lastData.latitude + " " +Input.location.lastData.longitude + " "+ Input.location.lastData.altitude + " " + Input.location.lastData.timestamp);if (callback != null){callback(Input.location.lastData.longitude, Input.location.lastData.latitude);}}Input.location.Stop();}

通过Unity自带的定位误差也可以控制在10米左右,如果只是用来定位,使用Unity原生定位就足够了。
淘宝通过IP获取位置的接口是:“http://ip.taobao.com/service/getIpInfo.php?ip=” + ip;
但是通过淘宝接口获取的地址只能到市级不够精确。

下面正式介绍Unity接高德SDK

首先进入高德开放平台:https://lbs.amap.com/
注册自己的开发者账号,进入到控制台,创建自己的应用,然后根据高德的开发文档来获取对应的key

关于SHA1的获取点击如何获取根据教程一步一步来就行了,包名就是你Unity打包时所使用的包名;
点击提交就能获取到高德的key了。
关于如何创建安卓工程,和Unity进行交互,网上有很多教程,这里就不详细说了。

将从高德下载的sdk中的AMap_Location_V4.7.0_20190708.jar拖到libs文件夹里,接下来

右键选中Open Module Settings打开下面的面板,进行操作

选择第二个找到刚才拖进去的jar

选择ok就行了。
接下来就是在android studio中写代码,其实就是将高德里的相关教程抄过来就行了

package com.maozhou.U3DMJ;//import android.support.v7.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.Context;
import android.os.Bundle;import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;public class MainActivity {public static AMapLocationClient mLocationClient = null;public static AMapLocationClientOption mLocationOption = null;private static String LocationInfo = "123";private static String ErrorInfo = "hhhh";public static String[] GetInfo(){String[] a = new String[2];startLocation();a[0] = LocationInfo;a[1] = ErrorInfo;return a;}private static void startLocation(){Context context = UnityPlayer.currentActivity.getApplicationContext();mLocationClient = new AMapLocationClient(context);//回调监听mLocationClient.setLocationListener(mLocationListener);//初始化定位参数mLocationOption = new AMapLocationClientOption();//设置定位模式为高精度模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位间隔,单位毫秒//this.mLocationOption.setInterval(1000L);mLocationOption.setHttpTimeOut(10000L);mLocationOption.setOnceLocation(true);mLocationOption.setNeedAddress(true);mLocationOption.setOnceLocationLatest(true);mLocationClient.setLocationOption(mLocationOption);mLocationClient.startLocation();}public static AMapLocationListener mLocationListener = new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (aMapLocation != null){if (aMapLocation.getErrorCode() == 0){StringBuffer sb = new StringBuffer(256);SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date(aMapLocation.getTime());String time = df.format(date);sb.append("时间:"+time);sb.append("\n纬度:" + aMapLocation.getLatitude());sb.append("\n经度:" + aMapLocation.getLongitude());sb.append("\n精度:"+ aMapLocation.getAccuracy());sb.append("\n地址:" + aMapLocation.getAddress());sb.append("\n省信息:" + aMapLocation.getProvider());LocationInfo = sb.toString();UnityPlayer.UnitySendMessage("GameManager", "PositonInformation", aMapLocation.getLatitude() + "," + aMapLocation.getLongitude() + "," + aMapLocation.getCountry() + "," + aMapLocation.getProvince() + ","+ aMapLocation.getDistrict() + "," + aMapLocation.getStreet() + "," + aMapLocation.getStreetNum());}else{StringBuffer errorinfo = new StringBuffer(256);errorinfo.append("错误代码:" + aMapLocation.getErrorCode());errorinfo.append("\n" + aMapLocation.getErrorInfo());ErrorInfo = errorinfo.toString();UnityPlayer.UnitySendMessage("GameManager", "ErrorCode", ErrorInfo);}}else{LocationInfo = "aMapLocation == null";}}};}

上面的代码就是获取高德定位的详细信息,包括经纬度,详细定位的位置信息等
然后是AndroidManifest.xml中的设置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.maozhou.common"><applicationandroid:allowBackup="true"android:supportsRtl="true"><meta-data android:name="com.amap.api.v2.apikey" android:value="8a8252c32de9b1c316a2308d9181d3aa"></meta-data><service android:name="com.amap.api.location.APSService"></service></application><!--用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!--获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!--用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!--用于访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET"></uses-permission><!--用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!--用于申请调用A-GPS模块--><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission><!--用于申请获取蓝牙信息进行室内定位--><uses-permission android:name="android.permission.BLUETOOTH"></uses-permission><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
</manifest>

这些都能在高德教程中找到,粘贴过来就行。
然后打开这个

//注释或删除这行
//apply plugin: 'com.android.application'
//改成下面这样,这样就可以打aar包了
apply plugin: 'com.android.library'
android {compileSdkVersion 29defaultConfig {//注释或删除,不然打aar包时也会报错//applicationId "com.example.myapplication"minSdkVersion 16targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:29.+'implementation 'com.android.support.constraint:constraint-layout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

因为我只需要安卓端的代码,其他都不需要,所以我把main中其他的文件夹都直接给删除了,只留下这些,引起哪里报错直接删除那部分报错的就行


选中你要打arr包的module点击build选择第二个,等待打包成功就行了
然后在build/outputs/aar中找到aar包,然后打开aar包所在的文件夹,在aar包名后加上zip直接点击打开不要解压,将里面无用的东西删除,如果,你不需要安卓的布局,和我一样,只为了使用代码,可以和我一样只留这么多
打开libs

不管你需不需要安卓的布局,libs中的class.jar都要删除,不然Unity打包时会报错
然后在unity中创建以下文件夹,并将arr包放进去

不需要将AndroidManifest.xml也导进Unity中。

接下来是Unity中的代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class LocalPos : MonoBehaviour
{public Text text;public Text text1;public InputField t1;public InputField t2;public InputField t3;public InputField t4;public Text wucha;public Button btn;AndroidJavaClass jc;AndroidJavaObject jo;Action<float, float> ac;void Start(){ac = ShowText;}private void ShowText(float a,float b){text1.text = a.ToString() + "MMMMM";text1.text += b.ToString();}public void GetLocation(){string[] a;OnStart();wucha.text = "jc" + jc + "jo" + jo;a = jc.CallStatic<string[]>("GetInfo");if (t1.text != "" && t2.text != "" && t3.text != "" && t4.text != ""){wucha.text ="距离:" + Algorithm(double.Parse(t1.text), double.Parse(t2.text), double.Parse(t3.text), double.Parse(t4.text)).ToString();}}public void PositonInformation(string strs){text.text += strs + "1233";}public void ErrorCode(string code){text.text += code + "1233";}// 获取GPS定位 经纬度public IEnumerator GetGPS(Action<float, float> callback){IList<int> s = new List<int>(); if (!Input.location.isEnabledByUser)yield break;Input.location.Start(5, 5);int maxWait = 20;while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0){yield return new WaitForSeconds(1);maxWait--;}if (maxWait < 1){Debug.LogError("GPS Start Timed out");yield break;}if (Input.location.status == LocationServiceStatus.Failed){Debug.LogError("GPS Unable to determine device location");yield break;}else{Debug.LogError("GPS Location: " + Input.location.lastData.latitude + " " +Input.location.lastData.longitude + " "+ Input.location.lastData.altitude + " " + Input.location.lastData.timestamp);if (callback != null){callback(Input.location.lastData.longitude, Input.location.lastData.latitude);}}text = GameObject.Find("").GetComponent<Text>();Input.location.Stop();}// 计算两个经纬度之间的距离public static double Algorithm(double longitude1, double latitude1, double longitude2, double latitude2){double Lat1 = Rad(latitude1); // 纬度double Lat2 = Rad(latitude2);double a = Lat1 - Lat2; //两点纬度之差double b = Rad(longitude1) - Rad(longitude2); //经度之差double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +Math.Cos(Lat1) * Math.Cos(Lat2) * Math.Pow(Math.Sin(b / 2), 2))); //计算两点距离的公式s = s * 6378137.0; //弧长乘地球半径(半径为米)s = Math.Round(s * 10000d) / 10000d; //精确距离的数值return s;}//角度转换成弧度private static double Rad(double d){return d * Math.PI / 180.00;}void OnStart(){jc = new AndroidJavaClass("com.maozhou.U3DMJ.MainActivity");//jo = jc.GetStatic<AndroidJavaObject>("currentActivity");}}

这部分代码比较乱,主要代码只有这几部分,OnStart获取一个AndroiudJavaClass实例,
a = jc.CallStatic<string[]>(“GetInfo”);//这个是调用安卓里的Getinfo这个静态方法的
PositonInformation()//这个方法是用来给安卓端回调用的,因为获取位置信息是异步的,所以要等获取到详细位置信息然后返回给Unity使用
ErrorCode();这个也是给安卓回调用的,主要是用来显示获取位置信息的报错信息。
其他的代码都是我的测试代码,可以删除。

下面说说我因为AndroidManifest.xml中的一些配置问题而遇到的一些问题,主要还是打包出来的应用名字和icon的问题:

因为我也是第一次接sdk,所以就在网上看了很多教程,基本上都需要将AndroidManifest.xml导入到Unity中,但是导入之后我发现我打出来的包名字和icon都不对
后来百度发现需要在AndroidManifest.xml中加上下面报红的那两句代码。一定一定要导入Unity之后再添加,不然会和我一样报红。

打包时的报错信息我都没有保存,就不一一说了,我遇见的都是java环境的配置和sdk版本的问题,大多网上都可以找到答案,自己也可以根据报错猜测是哪里的问题,慢慢调试就行了。

结尾

第一次写博客,只是为了详细记录一下过程,以防以后自己生疏了,因为公司主程离职了,所以这些都是我自己一个坑一个坑踩过来的,也废了挺长时间,如果各位大神发现有错误的地方还请及时提出,可以让我及时改正。
996的工作真的是让人懒的动,希望以后自己能够一边学习,一边反思,并且以博客的形式记录下来吧,不然真的很容易遗忘

Unity接高德SDK(Android)相关推荐

  1. Unity接入高德SDK实现定位

    一.在高德官网下载需要对应的SDK  http://lbs.amap.com/api/android-location-sdk 通过SHA1值获取对应的key值 a.SHA1值得获取:  1.在cmd ...

  2. android打包jar包给unity使用接入高德sdk,实现定位。

    https://blog.csdn.net/unity_http/article/details/79929454 https://blog.csdn.net/why1happy/article/de ...

  3. android 高德地图sha1,Android调试高德SDK,如何获取SHA1?

    debug版本: 默认的debug签名是在放在C:\Users\主机名称\.android debug.keystore 在Android studio的Terminal里输入 C:\Users\pc ...

  4. Android接入高德地图SDK,Android高德SDK 地图篇一:集成高德SDK

    Android高德SDK 地图篇一:集成高德SDK 大家好,这是系列博文的第一篇: 系列博文会完成以下功能 一. 地图篇:利用高德SDK实现滴滴出行的效 二. 导航篇:利用高德SDK实现滴滴司机端的效 ...

  5. 【Android笔记】Android 使用高德SDK获取定位

    Android 使用高德SDK获取定位 在Android开发过程中,经常需要获取手机的定位,这里记录一下使用搞的定位的过程.我选择使用高德的SDK,其实也有Web的API,但是API使用IP定位,An ...

  6. Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)

    日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...

  7. Android - 简单的显示高德SDK中的3D地图

    简单的显示高德SDK中的3D地图 身为一个安卓小白,前几天试了一下高德SDK,踩了几个蠢蠢的坑,秉承着别让其他小白也踩到,我就写一篇怎么简单的实现高德SDK显示地图与小蓝点的教程. 获得key 1.先 ...

  8. Android调试高德SDK,如何获取SHA1?

    debug版本: 默认的debug签名是在放在C:\Users\主机名称\.android debug.keystore 在Android studio的Terminal里输入 C:\Users\pc ...

  9. 高德sdk定位当前位置_相关下载-Android 定位SDK | 高德地图API

    高德 开发 Android 定位SDK 相关下载 更新时间:2020年11月16日 { "tab":[ "Android 定位SDK", "Andro ...

最新文章

  1. Tensorflow基础入门十大操作总结
  2. !!!光线对视频识别技术的影响
  3. 设计模式总结之Composite Pattern(组合模式)
  4. 服务器2008 系统日志 提示打印机,介绍服务器日志出现打印机错误的解决方法
  5. Unity AssetBundles and Resources指引 (三) AssetBundle基础
  6. dbmsjobs记录表 oracle_oracle数据库定时任务dbms_job
  7. HTK下yes/no的识别
  8. php 空文件夹,使用PHP删除空子文件夹
  9. python中pd.read_Windows下Python的pd.read_excel()报错
  10. 算法竞赛学习资源整理
  11. linux ulimit知识
  12. 2019python下半年考试报名时间_关于2019年下半年全国计算机等级考试报名的通知...
  13. 计算机专业sci二区难吗,二区的sci有多难?sci二区版面费一般多少?
  14. Choerodon猪齿鱼诞生记
  15. iphone日历怎么跳转日期_苹果手机日历怎么指定日期提醒?
  16. RFID固定资产条码标签管理系统,使资产更易盘点
  17. css 网站大背景(按比例缩放背景图片)
  18. Vasp二维材料单胞基本计算范例
  19. 你觉得学 Python 还是 Java 更好找工作?
  20. 云豹短视频app源码中,标签选择功能的实现

热门文章

  1. 文件md5查看 文件sha256查看
  2. 网络***实用战术手册(UNIX)
  3. 如何进行小微信贷风控?
  4. 使用C语言+EasyX完成消灭星星游戏(2)
  5. 初创合伙公司如何分配股权
  6. java面向对象编程思想_Java面向对象编程思想的理解
  7. 新浪微博信息流的设计问题
  8. 【Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构体源码分析 | zone 结构体源码 )
  9. 自制编程语言,六个令你迷惑的问题
  10. 基于铁犀牛ironrhino平台的税务档案管理系统