Android开发 百度地图开发(定位、传感器应用)

本文介绍了如何在Android中结合百度地图SDK和传感器实现实时定位、手机朝向计算、ToggleButtons以及摇一摇功能。通过动态申请权限、使用LocationManager和SensorManager,实现了地图上的用户定位和方向指示,同时通过摇一摇触发地图模式切换。
摘要由CSDN通过智能技术生成

前言

结合传感器的使用实现百度地图的开发,基本功能包括实时定位。其中利用传感器确定手机朝向并实现图标方位转动以及摇一摇功能的实现。

功能介绍

  1. 调用百度地图SDK实现地图的展示以及交互,其中包括左下角的按钮,实现的功能如下:

  2. 获取当前所在位置与方向,并在百度地图上显示出来,如图中黑色箭头所示,箭头中心位置为定位结果,箭头方向为手机的朝向。

  3. 实现简单摇一摇功能,比如我通过摇一摇实现了手机的震动以及更多模式的选择。
  4. 最终界面显示:

功能实现

大坑说在前面:按一般习惯,控件的声明后就直接显示了,所以一般将它们在一起。比如在一个函数里设置定位图标并紧接着放入地图,但在传感器监听器中直接调用该函数时发现,图标一直存在明显的闪动,后分析觉得是每次重复声明并设置图标导致的。无独有偶,在实现摇一摇功能时将创建对话框(Create)和显示(show)一起直接放在摇一摇检测中时,运行也会导致对话框无法消失,发现也是不断创建对话框导致的,所以将create与show分开,即在检测外面单独定义一个创建函数(createDialog),检测通过后只是简单的显示dialog,详见后面。如有错误欢迎指正,谢谢。

前期配置

要想完成百度地图的开发,需要成为其开发者,过程包括申请密钥,下载SDK依赖包,AS导入包等,具体参见百度地图开发者官方网站基本可以完成,这里就不细讲了,有疑问可以沟通:
申请密钥Android SDK http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key
配置环境及发布Android SDK :http://lbsyun.baidu.com/index.php?title=androidsdk/guide/buildproject
Hello BaiduMap:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap

动态申请权限

特别的,由于Android API 23以上需要动态申请权限,这里使用一个Github上的开源工具RxAndroid4进行处理,也可以自己根据Android官方的API进行或者其他的工具。首先需要在build.gradle中加入需要的依赖项:

然后新建一个启动的Activity,在这个单独的Activity的onCreate方法里检查是否获取需要的权限,如果没有则直接退出程序,实现代码参考如下:

实时定位

获取用户的经纬度信息需要使用位置管理器LocationManager,同时需要确认手机打开了位置服务。

mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

位置服务有一个位置的数据来源称为provider,可以分为NETWORK_PROVIDER和GPS_PROVIDER,其中NETWORK_PROVIDER使用基站和Wi-Fi信号来决定用户的位置,更新速度更快耗电量更少,但可能精确度较低,而GPS_PROVIDER使用GPS卫星进行定位,精度高但只能在室外使用,耗电量也更高。在使用过程中可以选择使用其中一个provider,也可以两个provider同时使用。(我的实现为获取最佳provider)
位置检测更新与监听器实现:

locationManager.requestLocationUpdates(provider, 0, 0, locationListener);


private LocationListener locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            convertCoor(location);
            showLocation();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {
            //location = getBestLocation(locationManager);
            location = locationManager.getLastKnownLocation(provider);
        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
通过获取最佳provider获取位置坐标(定位的关键)
location = locationManager.getLastKnownLocation(provider);


private void getBestProvider() {
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
        criteria.setAltitudeRequired(false);//无海拔要求
        criteria.setBearingRequired(false);//无方位要求
        criteria.setCostAllowed(true);//允许产生资费

        // 获取最佳服务对象
        provider = locationManager.getBestProvider(criteria,true);
    }
由于百度地图所用的位置坐标标准不同于直接获取的位置坐标,所以需要一个坐标的转换:
private void convertCoor(Location location) {
        // 将GPS设备采集的原始GPS坐标转换成百度坐标
        CoordinateConverter converter  = new CoordinateConverter();
        converter.from(CoordinateConverter.CoordType.GPS);
        converter.coord(new LatLng(location.getLatitude(), location.getLongitude()));
        desLatLng = converter.convert();
    }
最后就是添加定位图标及显示位置:
private void init() {

        Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.pointer), 100, 100, true);
        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(bitmap);

        baiduMap.setMyLocationEnabled(true);
        MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, bitmapDescriptor);
        baiduMap.setMyLocationConfigeration(configuration);

        if (isFirst) {
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值