MUI应用调用百度地图Android定位SDK

开发基于百度地图的MUI Feature

注意:需要先进行离线打包,具体操作可看官网

新建一个类,继承io.dcloud.common.DHInterface.StandardFeature

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import org.json.JSONArray;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
import static io.dcloud.common.util.ReflectUtils.getApplicationContext;
/**
 * 此类用于与前端js进行交互
 */
public class BaiduMapFeature extends StandardFeature {

    public static final String TAG = "BaiduMapFeature";
    public LocationClient locationClient = null;

    /**
     * 异步调用原生的方法
     *
     * @param webview 调用这个原生方法的js所在的webview
     * @param json    js调用时传入的参数列表
     */
    public void getLocation(IWebview webview, JSONArray json) {
        try {
            Log.e(TAG, "开始定位");
           //定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
            locationClient = new LocationClient(getApplicationContext());
            //声明LocationClient类实例并配置定位参数
            LocationClientOption locationOption = new LocationClientOption();

            String callbackId = json.getString(0);
            MyLocationListener myLocationListener = new MyLocationListener(webview, callbackId);

            //注册监听函数
            locationClient.registerLocationListener(myLocationListener);
            //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
            locationOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

            //可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
            locationOption.setCoorType("bd09ll");
            //可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
            locationOption.setScanSpan(1000);
            //可选,设置是否需要地址信息,默认不需要
            locationOption.setIsNeedAddress(true);
            //可选,设置是否需要地址描述
            locationOption.setIsNeedLocationDescribe(true);
            //可选,设置是否需要设备方向结果
            locationOption.setNeedDeviceDirect(true);
            //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
            locationOption.setLocationNotify(true);
            //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
            locationOption.setIgnoreKillProcess(true);
            //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
            locationOption.setIsNeedLocationDescribe(true);
            //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
            locationOption.setIsNeedLocationPoiList(true);
            //可选,默认false,设置是否收集CRASH信息,默认收集
            locationOption.SetIgnoreCacheException(false);
            //可选,默认false,设置是否开启Gps定位
            locationOption.setOpenGps(true);
            //可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
            locationOption.setIsNeedAltitude(false);
            //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
            locationOption.setOpenAutoNotifyMode();
            //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
            locationOption.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
            //需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
            locationClient.setLocOption(locationOption);
            //开始定位
            locationClient.start();


        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 异步调用原生的方法
     *
     * @param webview 调用这个原生方法的js所在的webview
     * @param json    js调用时传入的参数列表
     */
    public void stopGetLocation(IWebview webview, JSONArray json) {
        try {
            locationClient.stop();
            String callbackId = json.getString(0);
            JSUtil.execCallback(webview, callbackId,"stop success", JSUtil.OK, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 实现定位回调
     */
    public class MyLocationListener extends BDAbstractLocationListener {

        private IWebview iWebview;
        private String callbackId;
        public MyLocationListener(IWebview iWebview, String callbackId){
            this.iWebview = iWebview;
            this.callbackId = callbackId;
        }

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

            //获取纬度信息
            double latitude = location.getLatitude();
            //获取经度信息
            double longitude = location.getLongitude();
            float direction = location.getDirection();
            //获取定位精度,默认值为0.0f
            float radius = location.getRadius();
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
            String coorType = location.getCoorType();
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
            int errorCode = location.getLocType();
            Log.e(TAG, "获取位置成功" + "latitude: " +  latitude  + ", longitude: " +  longitude + "deretion: " + location.getDirection());

            JSUtil.execCallback(iWebview, callbackId, "{latitude:" +  latitude  + ",longitude:" +  longitude + "}" , JSUtil.OK, true);
        }
    }
}

注册插件(assets/data/dcloud_properties.xml

<properties>
	<features>
		<!-- 项目自定义feature -->
		<feature name="BaiduMapFeature" value="com.sc.myapplication.BaiduMapFeature"/>
		<feature name="ZXingFeature" value="com.sc.myapplication.ZXingFeature"/>
	</features>	
</properties>

JS进行调用(main.html

<html class="ui-page-login">

	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title>主页面</title>

	</head>

	<body>
		<div class="mui-content" id="mainPage">
			定位结果 :
			<ul>
				<li v-for="item in result">
					{{item}}
				</li>
			</ul>

		</div>
		<script src="js/mui.min.js"></script>
		<script src="js/vue.min.js"></script>

		<script>
			(function($, owner) {
				
			      var  mainPage = new Vue({
			      	el:"#mainPage",
			      	data:{
			      	    result:[]
			      	}
			      });


				$.plusReady(function() {


					var bridge = plus.bridge;

					//获取回调的id
					var callbackId =  bridge.callbackId(function(result){
						mainPage.result.push(result);

					 }, function(err){

						mainPage.result.push(err);
					 });

					//调用Java代码
					plus.bridge.exec("BaiduMapFeature", "getLocation", [callbackId, "secondParam"]);

				});

			}(mui, MainPage={}));
		</script>
	</body>

</html>

结果:调用了Android 定位api,精度比网络定位更高,可使用更多的定位功能(设备方向,持续定位等)

在这里插入图片描述

Demo地址:https://github.com/zhengwenrong/MUIFeature.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值