Unity调用高德地图API,获取定位信息(Android)

来源:互联网 发布:比特币源码是什么语言 编辑:程序博客网 时间:2024/04/28 10:28

Unity调用高德地图API,获取定位信息(Android)

先在Android端实现定位功能,再打包成JAR文件提供接口方法给Unity调用。

Unity3D (5.3.4) 
Eclipse: Neon(4.6.0)

Unity提供了跟Android交互的接口,可以参考雨松大大的博客。


1.首先新建一个Android工程,在最小SDK版本里选4.0以上,不然在Unity打包的时候会报错。

这里写图片描述

2.创建出来的工程目录如下:

这里写图片描述

3.可以删掉MainActivity里面不必要的代码,引用的布局也要删掉:

package com.example.locationtest;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4.因为要调用Unity提供的接口,需要把Unity提供的JAR库classes.jar文件导入到我们的安卓工程里。我的Unity版本是5.3.4,文件在这里:

这里写图片描述

5.把库文件拖到Android工程的libs文件夹下面,右键选Build Path ->Add to Build Path导入包。

这里写图片描述

6.Activity中的方法想要被Unity调用,这个Activity就需要继承UnityPlayerActivity,这是Unity提供的包里面的接口类。代码里写了一个GetInfo()的方法给Unity在代码中调用,获取定位的信息LocationInfo。

package com.example.locationtest;import android.os.Bundle;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {    private String LocationInfo;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }    public String GetInfo(){        return LocationInfo;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

7.接下来就是实现高德地图中的定位功能了,这方面的内容可以参考官网的文档,还是很容易实现的,这里就不详述了。我的代码如下:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.locationtest"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="16"        android:targetSdkVersion="21" />    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>    <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>    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <service android:name="com.amap.api.location.APSService"></service>        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <meta-data android:name="com.amap.api.v2.apikey" android:value="ac239bfa4a6067c16fe5d1bc32347f83">                  </meta-data>    </application></manifest>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

MainActivity.Java:

package com.example.gdloctest;import android.os.Bundle;import android.util.Log;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.AMapLocationListener;import com.unity3d.player.UnityPlayerActivity;;public class MainActivity extends UnityPlayerActivity {    //声明AMapLocationClient类对象    public AMapLocationClient mLocationClient = null;    //声明AMapLocationClientOption对象    public AMapLocationClientOption mLocationOption = null;    //定位回调字符串    private String LocationInfo;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }    public String GetInfo(){        startLocation();        return LocationInfo;    }    @Override    protected void onStart() {        // TODO Auto-generated method stub        super.onStart();    }    private void startLocation(){        //初始化定位        mLocationClient = new AMapLocationClient(getApplicationContext());        //设置定位回调监听        mLocationClient.setLocationListener(mLocationListener);        //初始化AMapLocationClientOption对象        mLocationOption = new AMapLocationClientOption();        //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。        mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);        //设置定位间隔,单位毫秒,默认为2000ms,最低1000ms。        mLocationOption.setInterval(2000);        //给定位客户端对象设置定位参数        mLocationClient.setLocationOption(mLocationOption);        //启动定位        mLocationClient.startLocation();    }    public AMapLocationListener mLocationListener = new AMapLocationListener() {        @Override        public void onLocationChanged(AMapLocation location) {            // TODO Auto-generated method stub            if (location != null) {                if (location.getErrorCode() == 0) {                    StringBuffer sb = new StringBuffer(256);                    sb.append("时间: ");                    sb.append(location.getTime());                    sb.append("\n纬度:");                    sb.append(location.getLatitude());                    sb.append("\n纬度:");                    sb.append(location.getLongitude());                    sb.append("\n精度:");                    sb.append(location.getAccuracy());                    sb.append("\n地址:");                    sb.append(location.getAddress());                    sb.append("\n国家信息:");                    sb.append(location.getCountry());                    sb.append("\n省信息:");                    sb.append(location.getProvince());                    sb.append("\n城市信息:");                    sb.append(location.getCity());                    sb.append("\n城区信息:");                    sb.append(location.getDistrict());                    sb.append("\n街道信息:");                    sb.append(location.getStreet());                    sb.append("\n街道门牌号信息:");                    sb.append(location.getStreetNum());                    sb.append("\n城市编码:");                    sb.append(location.getCityCode());                    sb.append("\n地区编码:");                    sb.append(location.getAdCode());                    sb.append("\n定位点AOI信息:");                    sb.append(location.getAoiName());                    LocationInfo = sb.toString();                }else {                //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。                Log.e("AmapError","location Error, ErrCode:"                    + location.getErrorCode() + ", errInfo:"                    + location.getErrorInfo());                }            }        }    };}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

8.接下来就可以打包成JAR文件给Unity调用了。选中我们的工程文件夹,可以先点击工具栏的Project->clean,再Project->Build Project。然后右键Export,选导出为JAR文件,点击Next,在下一个窗口中展开工程目录,只需要导出src这个文件夹就可以了。点击Finish,导出JAR文件…

这里写图片描述 
这里写图片描述 
这里写图片描述

9.将安卓工程的文件拷贝到Unity工程的Plugins->Android文件夹里。没有这个目录的话需要自己创建一个。文件夹目录如下,把我们刚刚导出的JAR文件放在的bin文件夹中,另外还需要把我们的安卓工程目录里把libs文件夹和res文件夹以及AndroidManifest文件拷贝进去,注意拷贝完要把libs文件夹里面的classes.jar文件删掉,不然文件会冲突

这里写图片描述

10.接着就可以在Unity中调用了。注意Unity中的包名要和Android工程里的保持一致,否则会无法调用。我们新建一个简单的场景,添加一个Text和Button控件,在我们点击Button的时候,Text就会显示获取到的定位信息。

这里写图片描述

11.新建一个脚本,挂载在摄像机上面:

using UnityEngine;using System.Collections;using UnityEngine.UI;public class GetLocationInfo : MonoBehaviour {    public Text text;    // Use this for initialization    void Start () {    }    // Update is called once per frame    void Update () {    }    public void StartLocation() {        AndroidJavaClass jc = new   AndroidJavaClass("com.unity3d.player.UnityPlayer");        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");        text.text = jo.Call<string>("GetInfo");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在StartLocation()方法中通过jo.Call<返回值类型>(“方法名”)的方式调用了我们在Android工程里面提供的GetInfo方法。让Button的点击事件执行StartLocation()这个方法,即可获取定位信息。 
这里写图片描述

用模拟器测试有些信息好像获取不到,但是真机测试是没问题的…

0 0
原创粉丝点击