天天看點

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


}
           

在真機中能夠正确的定位

繼續閱讀