Android之百度地图(二)基础地图和定位
上一篇文章和大家分享了如何查看SHA1和申请百度地图的秘钥,现在继续和大家分享如何实现百度地图的基本地图的实现和定位。要在应用中使用百度地图,必须下载百度提供的相应的sdk和so文件,并导入到项目中,使用AS导入百度地图的依赖还是比较简单的。导入使用依赖有两种方法。
环境配置
方法 一、将下载好的文件解压后,直接解压后的文件的内容拷贝到项目的libs文件夹下,并且在build.gradle文件中添加一段代码
sourceSets{ main{ jniLibs.srcDirs = ['libs'] } }方法二、解压下载后的文件,将文件中的jar文件拷贝到项目的libs文件夹下,在项目下创建jnilibs文件夹,并将解压后的文件夹中的armeabi文件夹拷贝到jnilibs文件夹下即刻。
在mainfast文件中在标签application中添加
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="申请的秘钥" />这里申请的秘钥就是第一篇分享的申请后的AK。
定位需要的服务:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
完成以上的一种配置后sync 一下项目,如果这些环境没有配置好,百度地图是无法实现的。
代码实现
一基本地图实现:
接下来看看如何实现基本地图:
首先在布局文件中使用MapView:
<com.baidu.mapapi.map.MapView
android:id="@+id/mv_bd_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.baidu.mapapi.map.MapView>
注意在activity文件中一定要在oncreate方法中,在sencontentView(),之前注册地图组件
SDKInitializer.initialize(getApplicationContext());
根据activity的生命周期,调用mapview的声明周期方法,从而实现跟对活动而展现和销毁mapview,给用户一个很好的体验。使用BaiduMap这个类对地图做一些配置,例如修改地图的比例等。
二 定位
要实现定位功能需要使用到BaiduMap、LocationClient、BDLocationListener这几个类;
首先初始化LocationClient,注册定位监听,和一些定位后的结果信息配置
client = new LocationClient(this); mLocationListener = new MyLocationListener(); client.registerLocationListener(mLocationListener); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); option.setCoorType("bd09ll"); option.setIsNeedAddress(true); option.setOpenGps(true); option.setScanSpan(1000); client.setLocOption(option);然后在生命周期的onStart和onStop方法中开启和停止定位
@Override protected void onStart() { super.onStart(); baiduMap.setMyLocationEnabled(true); if (!client.isStarted()) { client.start(); }
baiduMap.setMyLocationEnabled(false); client.stop();再来实现BDLocationListener,想创建MyLocationData ,再baidumap设置data,获取定位到的位置的经纬度,通过动画的形式将位置改变到定位的显示
private class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation bdLocation) { MyLocationData data = new MyLocationData.Builder() .direction(mCurrentX) .accuracy(bdLocation.getRadius()) .latitude(bdLocation.getLatitude()) .longitude(bdLocation.getLongitude()) .build(); city = bdLocation.getCity(); baiduMap.setMyLocationData(data); latitude = bdLocation.getLatitude(); longitude = bdLocation.getLongitude(); MyLocationConfiguration config = new MyLocationConfiguration(mMapLocationMode,true,bitmapDes); baiduMap.setMyLocationConfiguration(config); if (isFirst){ LatLng latlng = new LatLng(latitude,longitude); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latlng); baiduMap.animateMapStatus(msu); isFirst = false; }三 权限配置
既然定位肯定需要使用网络等一些权限,在Android版本6.0及以上的版本是需要动态获取一些权限的
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>Android6.0以上没有动态获取权限的话是不能实现定位功能的,这里给出动态获取权限的代码
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED ||ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE },requestCode); }else { initLocationClient(); }
基本地图和定位就实现了