天天看点

Android——百度地图简单切换地图和实现定位

百度地图开发文档提供给我们很多地图用来选择
用一组RadioGroup进行两个地图的选择
  <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/rg">

        <RadioButton
            android:id="@+id/rB_NORMAL"
            android:layout_width="118dp"
            android:layout_height="wrap_content"
           android:checked="true"
            android:text="普通地图" />

        <RadioButton
            android:id="@+id/rB_SATELLITE"
            android:layout_width="108dp"
            android:layout_height="wrap_content"
            android:text="卫星地图" />
        
</RadioGroup>
           

map

<com.baidu.mapapi.map.MapView
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

</com.baidu.mapapi.map.MapView>
           

重新复习了一遍RadioGroup、RadioButton的用法,其中对于android:checked="true"默认选择是普通地图

在开启权限AndroidMainfest.xml开启权限

<!--获取设备网络状态,禁用后无法获取网络状态-->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <!--网络权限,当禁用后,无法进行检索等相关业务-->
 <uses-permission android:name="android.permission.INTERNET" />
 <!--读取设备硬件信息,统计数据-->
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <!--读取系统信息,包含系统版本等信息,用作统计-->
 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
 <!--获取设备的网络状态,鉴权所需网络代理-->
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许sd卡写权限,需写入地图数据,禁用后无法显示地图-->
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <!--这个权限用于进行网络定位-->
 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
 <!--这个权限用于访问GPS定位-->
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <!--获取统计数据-->
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <!--使用步行AR导航,配置Camera权限-->
 <uses-permission android:name="android.permission.CAMERA" />
 <!--程序在手机屏幕关闭后后台进程仍然运行-->
 <uses-permission android:name="android.permission.WAKE_LOCK" />
 <!--上面是使用地图时需要开启的权限下面是使用定位时需要开启的权限-->
 <!-- 这个权限用于进行网络定位 -->
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <!-- 这个权限用于访问GPS定位 -->
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

           

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

在MainActivity中 实现

package com.example.baidumap;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;

import android.app.Activity;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.model.LatLng;

public class MainActivity extends AppCompatActivity {
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    private RadioButton rB_NORMAL;
    private RadioButton rB_SATELLITE;
    private RadioGroup rg;
    private BitmapDescriptor mCurrentMarker;
    //private MyLocationConfigeration config;
    private Button bt_location;
    boolean isFirstLoc = true;
    //
    public LocationClient mLocationClient = null;
    public BDAbstractLocationListener myListener = new MyLocationListener();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        mMapView = findViewById(R.id.map);
        mBaiduMap = mMapView.getMap();
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        rg=findViewById(R.id.rg);
        rB_NORMAL=findViewById(R.id.rB_NORMAL);
        rB_SATELLITE=findViewById(R.id.rB_SATELLITE);
        rg.setOnCheckedChangeListener(new MyRadioButtonListener() );

        mBaiduMap.setMyLocationEnabled(true);
        //声明LocationClient类
        mLocationClient = new LocationClient(getApplicationContext());
//        //注册监听函数
        mLocationClient.registerLocationListener(myListener);
        // 定位初始化
        mLocationClient = new LocationClient(this);
        isFirstLoc = true;
        // 设置定位的相关配置
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.setOpenGps(true);//开启GPS
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);

        //设置locationClientOption
        mLocationClient.setLocOption(option);
        //注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
        //开启地图定位图层
        mLocationClient.start();


    }

    public class MyLocationListener extends BDAbstractLocationListener{
        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null)
                return;
            // 构造定位数据
            mBaiduMap.setMyLocationEnabled(true);
            //构造定位数据
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            // 设置定位数据
            mBaiduMap.setMyLocationData(locData);

            // 第一次定位时,将地图位置移动到当前位置
            if (isFirstLoc) {
                isFirstLoc = false;
                //float f=mBaiduMap.getMaxZoomLevel();
                LatLng xy = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(xy);
                mBaiduMap.animateMapStatus(status);
            }
        }
    }


    class MyRadioButtonListener implements RadioGroup.OnCheckedChangeListener {

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // 选中状态改变时被触发
            switch (checkedId) {
                case R.id.rB_NORMAL:
                    //获取地图控件引用普通地图
                    mMapView = findViewById(R.id.map);
                   mBaiduMap = mMapView.getMap();
                   mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                    break;
                case R.id.rB_SATELLITE:
                    //获取卫星地图
                       mMapView=findViewById(R.id.map);
                       mBaiduMap=mMapView.getMap();
                       mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                    break;
            }
        }
    }


    @Override
    protected void onStart() {
        // 如果要显示位置图标,必须先开启图层定位
        mBaiduMap.setMyLocationEnabled(true);
        if (!mLocationClient.isStarted()) {
            mLocationClient.start();
        }
        super.onStart();
    }

//    @Override
//    protected void onStop() {
//        // 关闭图层定位
//        mBaiduMap.setMyLocationEnabled(false);
//        mLocationClient.stop();
//        super.onStop();
//    }

    @Override
    protected void onDestroy() {

        // 在activity执行onDestroy时执行mMapView.onDestroy()
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在activity执行onResume时执行mMapView. onResume ()
        mMapView.onResume();
    }

    @Override
    protected void onPause() {

        // 在activity执行onPause时执行mMapView. onPause ()
        mMapView.onPause();super.onPause();
    }


}
           

在真机中能够正确的定位

继续阅读