unity 调用高德地图手机读取信息定位和周边(AndroidStudio3.1.2版本打包)。

       首先也是看到网上有很多这这方面的博客,但是安卓Studio高版本对接unity高版本的却很少,有的还说高版本报错,我也是花时间研究了一下,感觉报错是正常的,一般还是配置环境问题。至于高版本报错,就有点夸张了,但是有很多细节还是要注意的。

下面就为大家分享下我的心得。我尽量写的详细点。

Unity安卓Studio3.1.2版本交互调用高德地图信息

准备材料:

1.我的unity版本是2018.1.18   电脑是 win10系统(家庭版)

首先就是unity打包apk 的整个环境配置,你可以参考我的CSDN博客:

https://blog.csdn.net/qwbin/article/details/81325127#comments

 

2.安卓Studio是AndroidStudio3.1.2/unity版本位2018.1.18

在这里安装教程我就不说 了。直接开始创建安卓工程。

这里全部默认就行了,点next。

这里默认也是默认就行。点击next。

 

选择图中所示Empty Activity。点击Next。

同样选择默认,点击Finish,等待2分钟会出现如下界面

 

创建Module:File =>new =>New Module

出现如下界面,选择Android Library。

点开如下图:

注意:这里的Package name:com.example.myLibrary 也就是unity 发布apk要对应的。如下图所示:

点击finish完成后,切换到project工程。

 

然后把unity jar包复制到libs文件里面:

放进去的时候会出现:

直接选择ok,如下图就完成了。

同样的方式把高德地图的jar包也放进来。如下图

然后选中这俩包,选择add as library

弹出页面选择OK,然后稍等片刻就完成了

完成后如下如:

接下来把他们添加依赖:点击file =>Project Structer

弹出页面选择myLibrary =>Dependencis

点击加号 选择jar dependency

弹出页面一次选择并且点击OK。

 

搞定之后,

把setContentView(R.layout.activity_main);删除,如上图,否则报错。

切换到安卓工程:找到自己library下的java里面的com.example.mylibrary,我的如下图。

安卓工程下如下图选择:

弹出的框选择默认:点击Finish

编辑类名,这个是用来和unity交互java文件,它和我们一开始创建就有的MainActivity不要搅浑。

这里也是我们要编辑的java脚本。别忘记把布局文件删除,这里我们用unity做,避免报错还是删除比较好。

这里细心的朋友应该发现我是俩工程,这个不用担心,因为5工程不小心删除了,用6重新做了,所有的都是一样的操作,也就是工程一模一样。

Unity jar包地址:

D:\UnityDownloadto\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

这里我们要注意:是mono\Release下的Classes,因为unity的jar包不止这一个。不要选错了如下图

因为安装的盘不同大家注意前面的对应盘,后面的基本都一样。

unity代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Getinto : 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", "酒店", "", 1);
    }
}

 

 

 

MainActivity.java脚本:

package com.example.mylibrary;

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());
                }
            }
        }
    };
}

配置文件(unity修改):AndroidManifest:

<?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"/>//这个是自己申请的key值
      <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

注意红色标记的内特容,package是对应unity的包名。

布置好后就可以打包了:

打包好后:如图查看,这里需要注意:安卓Studio3.1.2和其他版本不同,他的打包文件在packaged—里面,我们在里面找到libs和res拖进unity的Plugins\Android文件里面。

unity 发布成apk在手机上试试。

3.高德地图

首先要去高德地图开放平台注册一下。

 

进入控制台:

在应用管理获得自己key值:

SDK下载如下图

4.keystore 设置。

 

高德地图:

如上图 大家要只要简单记住:发布版本事安卓Studio里面的keyStore,调试是jdk自带的,也就是cmd中查找的。

如何生成Key值?

 

安卓Studio3.1.2:

按照网上的教程去做就行,因为简单就不写了。

如果你CMD中没有keyStore,可以输入:

 keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 

可以重新生成一个Key值,别忘了 记住自己的密码。

以下是keytool的选项以供参考:

Keytool选项

描述

-genkey

生成一个键对(公钥和密钥)

-v

日志输出

-keystore <keystore-name>.keystore

命名包含密钥的keystore

-storepass <password>

设定keystore的密码。

基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Keytool会提示你输入。这样,你的密码就不会储存在shell记录中了。

-alias <alias_name>

设定key的别名

-keyalg <alg>

指定生成key时使用的加密算法。支持DSARSA

-dname <name>

指定一个描述谁创建key的名字。该值将填入证书发行人的字段。

注意:你不需要在命令行中指明这些选项。如果不提供,Jarsigner会提示你输入每个字段(CNOU等)。

-validity <valdays>

Key的有效期,天数。

注意:推荐使用10000或更大的数。

-keypass <password>

Key的密码。

基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Keytool会提示你输入。这样,你的密码就不会储存在shell记录中了。

效果图:

显示不是很完美,可能是免费版的而且只有部分地区能显示。有待研究。

参考资料:

http://www.cnblogs.com/sangblog/p/6942369.html

https://blog.csdn.net/Sailor_luo/article/details/80290306

 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Unity是一款跨平台的游戏引擎,可以用来开发各种类型的游戏和应用程序。Android Studio是一个专门用于开发Android应用程序的集成开发环境(IDE),提供了丰富的工具和功能来帮助开发人员创建高质量的Android应用程序。百度地图是一款基于位置服务的地图应用,可以提供定位、导航、交通状况等功能。 使用UnityAndroid Studio结合起来开发应用程序,可以充分发挥两者的优势。Unity可以用来创建游戏场景、物体和特效,可以方便地进行游戏逻辑和交互设计。而Android Studio则可以用来编写Android应用的Java代码,进行应用程序的逻辑开发和界面设计。通过结合使用UnityAndroid Studio,开发人员可以实现更复杂、更丰富的应用程序。 百度地图提供了丰富的API和SDK,可以方便地在UnityAndroid Studio中集成使用。通过百度地图的API和SDK,开发人员可以在应用程序中添加地图显示、定位、搜索、导航等功能。例如,可以在Unity中创建一个游戏场景,然后使用百度地图的SDK将地图显示在场景中。同时,可以使用百度地图的API获取用户的位置信息,实现定位功能。还可以使用百度地图的搜索功能,让用户可以在应用程序中搜索地点,并进行导航。 总之,将UnityAndroid Studio和百度地图结合起来使用,可以实现更丰富、更具交互性的应用程序开发。无论是游戏还是其他类型的应用,这种结合可以提供更好的用户体验和更多的功能选择。 ### 回答2: Unity是一款跨平台的游戏引擎,而Android Studio则是一款集成开发环境(IDE),用于开发安卓应用程序。而百度地图是一款提供地理位置和导航服务的应用程序接口(API)。 UnityAndroid Studio可以结合使用来开发基于地图的游戏和应用。在Unity中,我们可以使用Unity的内置功能和插件来创建一个虚拟的游戏世界,并将百度地图的数据集成到游戏中。例如,在一个虚拟城市的游戏中,我们可以使用百度地图的API来获取真实世界的建筑和道路信息,并将其添加到游戏世界中,以增强游戏的逼真感。 Android Studio作为一个强大的开发工具,可以用于开发基于百度地图的安卓应用。我们可以使用Android Studio的界面设计工具和编码功能来构建一个用户友好的应用程序,并使用百度地图的API来获取用户位置、显示地图和提供导航功能。例如,我们可以开发一个实时公交查询应用,在用户身边显示附近的公交站点和实时公交车位置,并提供路线规划和导航功能。 总之,UnityAndroid Studio是两个强大的工具,可以与百度地图API结合使用,来开发出有趣、实用的地图相关的游戏和应用程序。通过充分发挥它们的优势,我们可以创造出更好的用户体验和更丰富的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值