6.Unity调用对应百度定位API
6.1 知识点
按照官方文档添加相关功能代码
创建MyLocationListener 类,可以直接复制官方提供的经纬度MyLocationListener 类
MainActivity写一个获取定位的GetCurrentPosition方法供Unity中使用,初始化LocationClient类,注意初始化要trycatch(官方文档说的)。注册监听。
配置经纬度的SDK参数,直接复制
修改MyLocationListener 类适配地址定位,当调用GetCurrentPosition获取当前定位信息后会复制到哪些字符串变量中
配置定位的SDK参数,直接复制
发起定位请求
将相关信息传递给Unity
在Unity创建按钮和文本,点击按钮调用安卓获取定位方法,并提供一个让安卓调用的方法
public Button btnOpen;
public Text txtInfo;
void Start()
{
// 将地址信息传递给Unity
btnOpen.onClick.AddListener(() =>
{
using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"))
{
androidJavaObject.Call("GetCurrentPosition");
}
}
});
}
// 提供给安卓端调用的函数 把定位信息传递过来
public void GetCurrentPosition(string info)
{
if (info.Contains("null"))
txtInfo.text = "定位中";
else
txtInfo.text = info;
}
在安卓端拼接获取的信息,调用Unity的函数,这样可以把定位信息显示到文本
将生成的aar包导入Unity
6.2 知识点代码
MainActivity
package com.tao.androidsdk;
import androidx.appcompat.app.AppCompatActivity;
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);
// setContentView(R.layout.activity_main);
}
public void GetCurrentPosition() {
LocationClient.setAgreePrivacy(true);
//setAgreePrivacy接口需要在LocationClient实例化之前调用
//如果setAgreePrivacy接口参数设置为了false,则定位功能不会实现
//true,表示用户同意隐私合规政策
//false,表示用户不同意隐私合规政策
try {
LocationClient mLocationClient = null;
MyLocationListener myListener = new MyLocationListener();
mLocationClient = new LocationClient(getApplicationContext());
//声明LocationClient类
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();
//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,便可发起定位请求
} catch (Exception e) {
e.printStackTrace();
}
}
}
MyLocationListener
package com.tao.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类中的说明
double latitude = location.getLatitude(); //获取纬度信息
double longitude = location.getLongitude(); //获取经度信息
float radius = location.getRadius(); //获取定位精度,默认值为0.0f
String coorType = location.getCoorType();
//获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
int errorCode = location.getLocType();
//获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取地址相关的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
String addr = location.getAddrStr(); //获取详细地址信息
String country = location.getCountry(); //获取国家
String province = location.getProvince(); //获取省份
String city = location.getCity(); //获取城市
String district = location.getDistrict(); //获取区县
String street = location.getStreet(); //获取街道信息
String adcode = location.getAdCode(); //获取adcode
String town = location.getTown(); //获取乡镇信息
// 构建位置信息字符串
StringBuilder locationInfo = new StringBuilder();
locationInfo.append("纬度: ").append(latitude).append("\n")
.append("经度: ").append(longitude).append("\n")
.append("定位精度: ").append(radius).append("\n")
.append("坐标类型: ").append(coorType).append("\n")
.append("定位类型: ").append(errorCode).append("\n")
.append("地址: ").append(addr).append("\n")
.append("国家: ").append(country).append("\n")
.append("省份: ").append(province).append("\n")
.append("城市: ").append(city).append("\n")
.append("区县: ").append(district).append("\n")
.append("街道: ").append(street).append("\n")
.append("邮政编码: ").append(adcode).append("\n")
.append("乡镇: ").append(town);
String message = locationInfo.toString();
// 发送位置信息到Unity
UnityPlayer.UnitySendMessage("Lesson6", "GetCurrentPosition", message);
}
}
Lesson06_Unity调用对应API
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Lesson06_Unity调用对应API : MonoBehaviour
{
public Button btnOpen;
public Text txtInfo;
void Start()
{
#region 知识点一 按照官方文档添加相关功能代码
#endregion
#region 知识点二 将相关信息传递给Unity
//将地址信息传递给Unity
btnOpen.onClick.AddListener(() =>
{
using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"))
{
androidJavaObject.Call("GetCurrentPosition");
}
}
});
#endregion
#region 知识点三 将生成的aar包导入Unity
#endregion
}
//提供给安卓端调用的函数 把定位信息传递过来
public void GetCurrentPosition(string info)
{
if (info.Contains("null"))
txtInfo.text = "定位中";
else
txtInfo.text = info;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com