Android之百度地图(二)基础地图和定位


        上一篇文章和大家分享了如何查看SHA1和申请百度地图的秘钥,现在继续和大家分享如何实现百度地图的基本地图的实现和定位。要在应用中使用百度地图,必须下载百度提供的相应的sdk和so文件,并导入到项目中,使用AS导入百度地图的依赖还是比较简单的。导入使用依赖有两种方法。 




环境配置


    方法  一、将下载好的文件解压后,直接解压后的文件的内容拷贝到项目的libs文件夹下,并且在build.gradle文件中添加一段代码


sourceSets{
    main{
        jniLibs.srcDirs = ['libs']
    }
}


       在mainfast文件中在标签application中添加


<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="申请的秘钥" />




定位需要的服务:


<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的生命周期,调用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);


@Override
protected void onStart() {
    super.onStart();
    baiduMap.setMyLocationEnabled(true);
    if (!client.isStarted()) {
        client.start();
    }
baiduMap.setMyLocationEnabled(false);
client.stop();


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"/>


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();
}


基本地图和定位就实现了