刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下

废话不多说

先上效果图

获取定位并根据手机朝向显示周边信息

          

使用的Unity版本为5.5,Androad Studio 2.3.1

接下来开始讲具体操作

首先是Androad Studio的基本配置


1.创建工程,空白的就行,反正也用不到界面布局

等待创建完成

2.新建库模块:

切换到Project视图

右击你的项目 新建一个库模块-用来负责与Unity交互

当然你也可以不选择新建库模块 直接在原生app模块进行操作

选择Android Library

等待生成完成

你会看到多出来的

3.创建MainActivity:我们新建的library中没有启动这个模块的Java类 所以需要手动创建一个

切换到Android视窗下 选中此文件右键创建

4.删除布局文件activity_main

布局文件是用来管理Android界面布局的,我们并不需要,所以将它删除,防止发生一些没必要的错误

5.修改配置文件:AndroidManifest

为了能够正常发布 需要将AndroidManifest进行一些修改

在这中间插入启动Activity的配置

        <activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

到这里基本配置就完了

然后进行测试点击这个

或许你会发现报错了 原因是我们在创建MainActivity的时候他自动引用了布局文件 所以这里应该将这一行删除

然后再次更新 成功

到这里基本配置以及完成

引入Unity与高德地图的包

下载高德地图包 这里有个定制选你要用的功能下载就好 这里我用到的是定位和搜索

将下载好的包拖入libs中

接下来是Unity的包

新建Unity工程

发布平台改Android

设置package name与你新建的library库一致

然后发布系统ADT 导出

在libs中找到

复制进Android Sturio中的libs

选中两个包Add As Library

选library工程 OK

等待加载完成

到这里引入包的操作已经完成

更改MainActivity并发布

主要内容为

获取当前定位信息

获取查询指定字符串周边信息

 package com.example.autlibrary;

 import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
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.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.unity3d.player.UnityPlayerActivity; public class MainActivity
extends UnityPlayerActivity
implements PoiSearch.OnPoiSearchListener
{
public AMapLocationClient mLocationClient = null;
public AMapLocationClientOption mLocationOption = null;
private String LocationInfo;
private String strRerurnInfo;
private PoiSearch.Query query;
private PoiResult poir;
private double Latitude;
private double Longitude;
private boolean bolIsPoi = false; protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
//获取定位信息
public String GetInfo()
{
startLocation();
this.bolIsPoi = true;
return this.LocationInfo;
}
//获取周边POI信息
public String GetPoi(String content, String val, int index)
{
startLocation();
search(content, val, index);
return this.strRerurnInfo;
} protected void onStart()
{
super.onStart();
} private void startLocation()
{
this.mLocationClient = new AMapLocationClient(getApplicationContext());
this.mLocationClient.setLocationListener(this.mLocationListener);
this.mLocationOption = new AMapLocationClientOption();
this.mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
this.mLocationOption.setInterval(2000L);
this.mLocationClient.setLocationOption(this.mLocationOption);
this.mLocationClient.startLocation();
} //三个参数分别为搜索字符串、搜索类型、查询第几页
//前两个参数选其一
//如:酒店、""、1
//第二个参数为poi搜索类型:
//汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|
// 医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|
// 交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
public void search(String content, String val, int index)
{
if (this.bolIsPoi) {
if (content == null)
{
Toast.makeText(this, "输入为空", Toast.LENGTH_SHORT).show();
}
else
{
this.query = new PoiSearch.Query(content, val, "");
this.query.setPageSize(30);
this.query.setPageNum(index);
PoiSearch poiSearch = new PoiSearch(this, this.query);
if ((this.Latitude != 0.0D) && (this.Longitude != 0.0D))
{
poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(this.Latitude, this.Longitude), 6000)); poiSearch.setOnPoiSearchListener(this);
poiSearch.searchPOIAsyn();
}
else
{
Toast.makeText(this, "定位失败", Toast.LENGTH_SHORT).show();
}
}
}
} public void onPoiSearched(PoiResult result, int code)
{
this.bolIsPoi = false;
System.out.println("Result" + (result.getPois().get(0)).getLatLonPoint());
System.out.println("Code" + code);
this.poir = result;
StringBuffer sb = new StringBuffer(256);
for (int j = 0; j < this.poir.getPois().size(); j++)
{
sb.append("\n名字:");
sb.append((this.poir.getPois().get(j)).getTitle());
sb.append("\n>地址:");
sb.append((this.poir.getPois().get(j)).getSnippet());
sb.append("\n>距离:");
sb.append((this.poir.getPois().get(j)).getDistance());
}
this.strRerurnInfo = sb.toString();
} @Override
public void onPoiItemSearched(PoiItem poiItem, int i) { } public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (location != null) {
if (location.getErrorCode() == 0) {
//获取坐标信息
Latitude = location.getLatitude();
Longitude = location.getLongitude(); StringBuffer sb = new StringBuffer(256);
sb.append("时间: " + location.getTime());
sb.append("\n纬度:" + location.getLatitude());
sb.append("\n经度:" + location.getLongitude());
sb.append("\n精度:" + location.getAccuracy());
sb.append("\n地址:" + location.getAddress());
sb.append("\n国家信息:" + location.getCountry());
sb.append("\n省信息:" + location.getProvince());
sb.append("\n城市信息:" + location.getCity());
sb.append("\n城区信息:" + location.getDistrict());
sb.append("\n街道信息:" + location.getStreet());
sb.append("\n街道门牌号信息:" + location.getStreetNum());
sb.append("\n城市编码:" + location.getCityCode());
sb.append("\n地区编码:" + location.getAdCode());
sb.append("\n定位点AOI信息:" + location.getAoiName());
LocationInfo = sb.toString();
}else {
Log.e("AmapError","location Error, ErrCode:"
+ location.getErrorCode() + ", errInfo:"
+ location.getErrorInfo());
}
}
}
};
}

MainActivity

修改完MainActivity 无错误的话 就可以发布了

发布到library库中

然后你在

“你的工程目录”\autlibrary\build\intermediates\bundles\debug中会有这些

右键Show in Exploer   并在文件夹中找到他们

这样就发布成功了

与Unity间的交互

上一步我们导出了工程包

我们需要将它修改为Unity可用的工程

复制classes.jar

粘贴到libs

删除libs中的unity-classes.jar

-

-

这样的话就修改成功了  然后我们将它导入Unity

复制libs和res文件夹到Unity

需要创建Plugins和Android文件夹 复制过后是这样的关系

这样就成功导入进了Unity

配置AndroidManifest.Xml文件,并创建C#脚本

不知道你还记不记得我们在Unity中导出的包 找到它!我们需要里面的Xml文件

将它复制到\Assets\Plugins\Android下

接着就要对它进行修改了

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.autlibrary" xmlns:tools="http://schemas.android.com/tools" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner">
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="64c821ae174ab7429fa45535d01f20ae"/>
<activity
android:label="@string/app_name" android:screenOrientation="fullSensor"
android:launchMode="singleTask"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"
android:name="com.example.autlibrary.MainActivity">
<service android:name="com.amap.api.location.APSService" ></service>
<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>
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25" />
<uses-feature android:glEsVersion="0x00020000" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
</manifest>

AndroidManifest

配置完毕就可以搭界面和写C#逻辑了

新建GetLocationAndPoiInfo脚本

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; public class GetLocationAndPoiInfo : MonoBehaviour { public Text locText;
public Text poiText;
public Button locBtn;
public Button poiBtn; AndroidJavaClass jc;
AndroidJavaObject jo; // Use this for initialization
void Start () {
OnStart();
locBtn.onClick.AddListener(() => { GetLocationInfo(); });
poiBtn.onClick.AddListener(() => { GetPoiInfo(); });
}
void OnStart() {
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
} void GetLocationInfo() {
locText.text = "";
OnStart();
locText.text = jo.Call<string>("GetInfo");
} void GetPoiInfo() {
locText.text = "";
OnStart();
poiText.text = jo.Call<string>("GetPoi", "酒店", "", );
}
}

GetLocationAndPoiInfo

将脚本挂在任何一个物体上

布置界面

因为是Android工程发布到手机(或模拟器)才能运行

上成果图

到这里接高德地图SDK的工作就做完了

根据手机朝向显示不同店家的逻辑我就不写了 挺麻烦的

我说一下思路:

在AndroidStudio中获取各个店家的经纬度与自身坐标点的相对位置信息并输出

在Unity中获取到这个信息、解析、并转换为角度、再转换为匹配Input.compass指南针坐标系的角度

然后设置一个视野范围(度数)

最后根据手机朝向显示视野范围内不同的店家

这么做有什么用处呢

做类似pokemon go这样的东西时候这些信息就有用了

写在最后:第一次公开写博,如有不妥之处请多指教

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作的更多相关文章

  1. iOS高德地图SDK定位和搜索附近信息的具体使用

    1.显示地图.定位.显示当前位置. 导入你需要的功能的头文件,申明全局变量,代理方法等等.   初始化地图,在控制器即将显示额时候打开定位和跟踪用户,这里对参数不懂的话康忙进去都有注释.   对了.i ...

  2. Android学习十一:高德地图使用

    写这篇文章主要有三个目的: 1.使用高德地图api定位 2.获取天气数据 3.编程练手 文件结构 清单文件信息说明: <?xml version="1.0" encoding ...

  3. Android Studio之高德地图实现定位和3D地图显示

    在应用开发中,地图开发是经常需要使用的“组件”,国内比较出名的是就是百度地图和高德地图. 此博客讲的是高德地图实现定位和3D地图显示,并标注相应位置,话不多说,先看看效果,在上代码. 效果如图: 首先 ...

  4. android 开发 我的高德地图代码例子

    下载高德地图依赖库和相关注册方式,请查看高德开发者网站:http://lbs.amap.com/api/android-sdk/summary  点击打开链接 高德地图坐标拾取器:http://lbs ...

  5. [OC][地图] 高德地图之定位初探(一)

    使用前的说明 高德地图开放平台的iOS定位模块网址-->http://lbs.amap.com/api/ios-location-sdk/summary/ 高德地图有Web端.android平台 ...

  6. objective-c高德地图时时定位

    这篇随笔是对上一遍servlet接口的实现. 一.项目集成高德地图 应为我这个项目使用了cocopods这个第三方库管理工具,所以只需要很简单的步骤,就能将高德地图集成到项目中,如果你没使用过这工具, ...

  7. Android应用中使用百度地图API定位自己的位置(二)

    官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发人员们提供了例如以下类型的地图覆盖物: ...

  8. vue2使用高德地图vue-amap定位以及AMapUI标注

    前言 最近在vue里使用了高德地图vue-amap以及AMapUI,我在这里就说下如何在vue2里引入vue-amap和AmapUI以及使用定位 (在这里默认你已经安装了vue-cli) 安装 npm ...

  9. Android 开发之集成百度地图的定位与地图展示

    app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,近期也在做定位功能,可是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了非常长时间来研究 ...

随机推荐

  1. C#,VB.NET如何将Word转换为PDF和Text

    众所周知,Word是我们日常工作中常用的办公软件之一,有时出于某种需求我们需要将Word文档转换为PDF以及Text.那么如何以C#,VB.NET编程的方式来实现这一功能呢? 下面我将分开介绍如何运用 ...

  2. sass入门学习篇(一)

    先简单的介绍一下sass,如果你了解less,sass就没什么太大问题 Sass 是对 CSS 的扩展,让 CSS 语言更强大.优雅. 它允许你使用变量.嵌套规则. mixins.导入等众多功能, 并 ...

  3. 蓝桥杯-四平方和-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  4. Set up HTTP/2 server with Spring Boot 【基于Spring boot搭建http2.0服务器】

    1. Server side With spring boot, we can set up a http server easily. Restcontroller make it easier t ...

  5. 【跑会指南】2017年3-5月IT技术会议大合集

    2016年各类大会让人应接不暇,技术圈儿最不缺的就是各种大会小会,有的纯干货,有的纯广告.作为一名技术开发者,参加了几场大会,你是不是也开始思忖:究竟哪些会议才值得参加?下面活动家为你推荐几场2017 ...

  6. Android RoboGuice 使用指南

    1.概述 在开发应用时一个基本原则是模块化,并且近最大可能性地降低模块之间的耦合性.在Java平台上Spring Framework 以及.Net 平台 CAB ,SCSF 和Prism (WPF,S ...

  7. php学习之string

    1. php str_replace函数: str_replace() 函数使用一个字符串替换字符串中的另一些字符. str_replace(find,replace,string,count) fi ...

  8. 解决U盘容量变小问题

    今天又想重新给电脑刷刷kali linux新版本了貌似N久没更,直接重新刷系统吧...然后发现USB容量变小,这就尴尬了,接着总结了个小方法. 解决方法:1.先把u盘插好,运行cmd,2.输入disk ...

  9. Java学习笔记——I/O流

    朝辞白帝彩云间,千里江陵一日还.两岸猿声啼不尽,轻舟已过万重山. --早发白帝城 我们老师写代码有个特点,就是简洁.每一句的意图都十分明确.所以他讲课的速度也比较快. 跑题了,说说I/O流: 1.字节 ...

  10. java内存模型二

    数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之 ...