6.Unity调用百度定位API

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

×

喜欢就点赞,疼爱就打赏