Unity接高德SDK(Android)
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)相关推荐
- Unity接入高德SDK实现定位
一.在高德官网下载需要对应的SDK http://lbs.amap.com/api/android-location-sdk 通过SHA1值获取对应的key值 a.SHA1值得获取: 1.在cmd ...
- android打包jar包给unity使用接入高德sdk,实现定位。
https://blog.csdn.net/unity_http/article/details/79929454 https://blog.csdn.net/why1happy/article/de ...
- android 高德地图sha1,Android调试高德SDK,如何获取SHA1?
debug版本: 默认的debug签名是在放在C:\Users\主机名称\.android debug.keystore 在Android studio的Terminal里输入 C:\Users\pc ...
- Android接入高德地图SDK,Android高德SDK 地图篇一:集成高德SDK
Android高德SDK 地图篇一:集成高德SDK 大家好,这是系列博文的第一篇: 系列博文会完成以下功能 一. 地图篇:利用高德SDK实现滴滴出行的效 二. 导航篇:利用高德SDK实现滴滴司机端的效 ...
- 【Android笔记】Android 使用高德SDK获取定位
Android 使用高德SDK获取定位 在Android开发过程中,经常需要获取手机的定位,这里记录一下使用搞的定位的过程.我选择使用高德的SDK,其实也有Web的API,但是API使用IP定位,An ...
- Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)
日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...
- Android - 简单的显示高德SDK中的3D地图
简单的显示高德SDK中的3D地图 身为一个安卓小白,前几天试了一下高德SDK,踩了几个蠢蠢的坑,秉承着别让其他小白也踩到,我就写一篇怎么简单的实现高德SDK显示地图与小蓝点的教程. 获得key 1.先 ...
- Android调试高德SDK,如何获取SHA1?
debug版本: 默认的debug签名是在放在C:\Users\主机名称\.android debug.keystore 在Android studio的Terminal里输入 C:\Users\pc ...
- 高德sdk定位当前位置_相关下载-Android 定位SDK | 高德地图API
高德 开发 Android 定位SDK 相关下载 更新时间:2020年11月16日 { "tab":[ "Android 定位SDK", "Andro ...
最新文章
- Tensorflow基础入门十大操作总结
- !!!光线对视频识别技术的影响
- 设计模式总结之Composite Pattern(组合模式)
- 服务器2008 系统日志 提示打印机,介绍服务器日志出现打印机错误的解决方法
- Unity AssetBundles and Resources指引 (三) AssetBundle基础
- dbmsjobs记录表 oracle_oracle数据库定时任务dbms_job
- HTK下yes/no的识别
- php 空文件夹,使用PHP删除空子文件夹
- python中pd.read_Windows下Python的pd.read_excel()报错
- 算法竞赛学习资源整理
- linux ulimit知识
- 2019python下半年考试报名时间_关于2019年下半年全国计算机等级考试报名的通知...
- 计算机专业sci二区难吗,二区的sci有多难?sci二区版面费一般多少?
- Choerodon猪齿鱼诞生记
- iphone日历怎么跳转日期_苹果手机日历怎么指定日期提醒?
- RFID固定资产条码标签管理系统,使资产更易盘点
- css 网站大背景(按比例缩放背景图片)
- Vasp二维材料单胞基本计算范例
- 你觉得学 Python 还是 Java 更好找工作?
- 云豹短视频app源码中,标签选择功能的实现