赞
踩
结合传感器的使用实现百度地图的开发,基本功能包括实时定位。其中利用传感器确定手机朝向并实现图标方位转动以及摇一摇功能的实现。
调用百度地图SDK实现地图的展示以及交互,其中包括左下角的按钮,实现的功能如下:
获取当前所在位置与方向,并在百度地图上显示出来,如图中黑色箭头所示,箭头中心位置为定位结果,箭头方向为手机的朝向。
大坑说在前面:按一般习惯,控件的声明后就直接显示了,所以一般将它们在一起。比如在一个函数里设置定位图标并紧接着放入地图,但在传感器监听器中直接调用该函数时发现,图标一直存在明显的闪动,后分析觉得是每次重复声明并设置图标导致的。无独有偶,在实现摇一摇功能时将创建对话框(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) {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。