UM4L5——Unity调用对应API

按照官方文档添加相关功能代码

此部分参考:

Android Studio内大致实现思路:

  • 声明一个监听类继承BDAbstractLocationListener​,它用于在MainActivity​内被调用,开始获取定位信息
    该类里需要实现一个监听定位成功的函数onReceiveLocation​,定位成功后通过传入的定位结果类BDLocation​对象获取定位的地址信息
    将获取到的地址信息通过UnityPlayer.UnitySendMessage()​发送到Unity,再通过Unity输出这些消息
  • MainActivity​内实现一个提供给Unity调用的获取地址的方法GetAddress()​,
    该方法会先执行隐私合规接口,确保获取地址消息正常,然后实例化LocationClient​和监听类MyLocationListener​,
    然后将监听类对象传入到LocationClient​内,待定位成功后就会调用MyLocationListener​的onReceiveLocation​方法
    然后设置各个参数,将调整的参数传入到LocationClient​对象内,最后执行LocationClient​对象的开始获取定位方法

具体代码如下:

MyLocationListener.java

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
package com.taikr.androidsdk;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.unity3d.player.UnityPlayer;

//监听类
public class MyLocationListener extends BDAbstractLocationListener {

//当定位成功时,就会调用这里的函数
@Override
public void onReceiveLocation(BDLocation location) {
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明

String addr = location.getAddrStr(); //获取详细地址信息
String country = location.getCountry(); //获取国家
String province = location.getProvince(); //获取省份
String city = location.getCity(); //获取城市
String district = location.getDistrict(); //获取区县
//将获取到的消息发送到Unity的方法上
UnityPlayer.UnitySendMessage("Lesson6", "GetAddress", country + "_" + province + "_" + city + "_" + district);
}
}

MainActivity.java

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
101
102
103
104
package com.taikr.androidsdk;

import android.os.Bundle;

import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

}

//提供给Unity调用的获取地址方法
public void GetAddress() {
//setAgreePrivacy接口需要在LocationClient实例化之前调用
//如果setAgreePrivacy接口参数设置为了false,则定位功能不会实现
//true,表示用户同意隐私合规政策
//false,表示用户不同意隐私合规政策
LocationClient.setAgreePrivacy(true);
try {
LocationClient mLocationClient = null;
MyLocationListener myListener = new MyLocationListener();
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(myListener);

LocationClientOption option = new LocationClientOption();

option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,设置定位模式,默认高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:仅使用设备;
//LocationMode.Fuzzy_Locating, 模糊定位模式;v9.2.8版本开始支持,可以降低API的调用频率,但同时也会降低定位精度;

option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认gcj02
//gcj02:国测局坐标;
//bd09ll:百度经纬度坐标;
//bd09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标

option.setFirstLocType(LocationClientOption.FirstLocType.ACCURACY_IN_FIRST_LOC);
//可选,首次定位时可以选择定位的返回是准确性优先还是速度优先,默认为速度优先
//可以搭配setOnceLocation(Boolean isOnceLocation)单次定位接口使用,当设置为单次定位时,setFirstLocType接口中设置的类型即为单次定位使用的类型
//FirstLocType.SPEED_IN_FIRST_LOC:速度优先,首次定位时会降低定位准确性,提升定位速度;
//FirstLocType.ACCUARACY_IN_FIRST_LOC:准确性优先,首次定位时会降低速度,提升定位准确性;

option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效

option.setOpenGnss(true);
//可选,设置是否使用卫星定位,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true

option.setLocationNotify(true);
//可选,设置是否当卫星定位有效时按照1S/1次频率输出卫星定位结果,默认false

option.setIgnoreKillProcess(false);
//可选,定位SDK内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)

option.SetIgnoreCacheException(false);
//可选,设置是否收集Crash信息,默认收集,即参数为false

option.setWifiCacheTimeOut(5*60*1000);
//可选,V7.2版本新增能力
//如果设置了该接口,首次启动定位时,会先判断当前Wi-Fi是否超出有效期,若超出有效期,会先重新扫描Wi-Fi,然后定位

option.setEnableSimulateGnss(false);
//可选,设置是否需要过滤卫星定位仿真结果,默认需要,即参数为false

option.setNeedNewVersionRgc(true);
//可选,设置是否需要最新版本的地址信息。默认需要,即参数为true

option.setIsNeedAddress(true);
//可选,是否需要地址信息,默认为不需要,即参数为false
//如果开发者需要获得当前点的地址信息,此处必须为true

option.setNeedNewVersionRgc(true);
//可选,设置是否需要最新版本的地址信息。默认需要,即参数为true

mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明

mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明

//正式执行获取定位的方法
mLocationClient.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

将相关信息传递给Unity

Unity脚本内大致实现思路:

  • 在界面上添加一个获取地址的按钮,以及在获取到地址后用于显示地址消息在屏幕上的文本控件
  • 按下获取地址按钮会调用Android的GetAddress()​方法,待获取定位结束后,Android会调用Unity的方法,将消息输出到文本控件上

具体实现代码如下:

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
using UnityEngine;
using UnityEngine.UI;

public class Lesson6 : MonoBehaviour
{
public Button btnOpen;
public Text txtInfo;

private void Start()
{
btnOpen.onClick.AddListener(() =>
{
using (AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity"))
{
ajo.Call("GetAddress");
}
}
});
}

//提供给安卓端调用的函数 把定位信息传递过来
public void GetAddress(string address)
{
txtInfo.text = address;
}
}

将生成的aar包导入Unity

将Android Studio的交互项目生成为arr包,再做必要的处理即可导入到Unity内调用
具体可看:UM3L5——Unity中嵌入Android内容