[android學習]__使用百度地圖開放api編寫地圖定位app


  • 前言

在前面我已經記錄關於如何使用百度地圖api,以及如何配置相關的androidstudio配置了,接下來將記錄如何使用百度地圖api開發簡單的地圖定位apk,我將決定不定期持續更新本篇筆記,在每個大的優化改動后.


  • 1.0 簡單的地圖顯示以及定位

首先我們打開對應的application項目(我們在之前申請百度地圖ak密鑰所對應的項目).如果你並沒有,你可以新建一個項目,並申請ak密鑰,然后將下載好的地圖SDK導入,編寫相關的配置.

這些都可以參看其開發文檔:

百度地圖SDK開發文檔

當然,里面也有比較詳細api的使用案例和說明,我們可以參考其案例和說明編寫程序.

  • 配置開發密鑰ak
    我們在項目的配置文件AndroidManifest.xml文件中添加以下代碼配置:
<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="開發者 key" />  
</application>
  • 申請相關的權限
//獲取設備網絡狀態,禁用后無法獲取網絡狀態
<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" />
  • 地圖初始化

新建application類初始化地圖

public class demoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地圖SDK所有接口均支持百度坐標和國測局坐標,用此方法設置您使用的坐標類型.
        //包括BD09LL和GCJ02兩種坐標,默認是BD09LL坐標。
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }
}

並在配置文件AndroidManifest.xml文件中聲明:

<application
        android:name=".demoApplication"

  • 布局文件

添加兩個控制顯示地圖類型的單選button控件,兩個控制可重復顯示的地圖類型的checkBox復選框控件.以及添加百度地圖的MapView容器.聲明id便於在后面設置事件監聽器.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
            <RadioGroup
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                >
            <RadioButton
                android:id="@+id/Rbtn_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="普通圖"
                android:layout_marginLeft="10dp"/>
            <RadioButton
                android:id="@+id/Rbtn_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:text="衛星圖"/>

                <CheckBox
                    android:id="@+id/cb_1"
                    android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:text="路況圖"
                    />
                <CheckBox
                    android:id="@+id/cb_2"
                    android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:text="城市熱力圖"
                    />
            </RadioGroup>
    <com.baidu.mapapi.map.MapView
        android:id="@+id/mMapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        ></com.baidu.mapapi.map.MapView>

</LinearLayout>

  • activity文件

定義initView方法初始化地圖,在方法體類為幾個button,checkbox設置監聽器,並實現其功能將當前地圖類型切換.

定義定義監聽函數,通過百度定位SDK中相應的方法實現簡單的地圖定位功能.
具體的方法使用,參考api開發文檔.里面有較詳細的說明和案例

package cn.gemuxiaoshe.gpsapplication;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
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.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mapView = null;
    private RadioButton rbtn_1, rbtn_2;
    private CheckBox cb_1, cb_2;
    private boolean isFirstLoc = true;
    private LocationClient locationClient;

    public MyLocationListenner myListener = new MyLocationListenner();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        // 獲取地圖控件的引用
        mapView = (MapView) findViewById(R.id.mMapView);
        // 開啟定位圖層
        mapView.getMap().setMyLocationEnabled(true);
        //定位初始化
         locationClient = new LocationClient(this);

        locationClient.registerLocationListener(myListener);

        //定位配置信息
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setCoorType("bd0911");
        option.setScanSpan(1000);
        locationClient.setLocOption(option);
        locationClient.start();
        initView();

    }



    /**
     * 定位SDK監聽函數
     */
    public class MyLocationListenner implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 銷毀后不在處理新接收的位置
            if (location == null || mapView == null) {
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此處設置開發者獲取到的方向信息,順時針0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mapView.getMap().setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(ll).zoom(18.0f);
                mapView.getMap().animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }


    private void initView() {
        rbtn_1 =(RadioButton)findViewById(R.id.Rbtn_1);
        rbtn_2 =(RadioButton)findViewById(R.id.Rbtn_2);

        cb_1 = (CheckBox) findViewById(R.id.cb_1);
        cb_2 = (CheckBox) findViewById(R.id.cb_2);


        rbtn_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) { // 設置為普通圖
                mapView = (MapView) findViewById(R.id.mMapView);
                mapView.getMap().setMapType(BaiduMap.MAP_TYPE_NORMAL);
            }
        });
        rbtn_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) { // 設置為衛星圖
                mapView = (MapView) findViewById(R.id.mMapView);
                mapView.getMap().setMapType(BaiduMap.MAP_TYPE_SATELLITE);
            }
        });
            // 設置復選框監聽事件,選中與取消選中的兩種事件.
        cb_1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (b){
                    mapView.getMap().setTrafficEnabled(true);
                    // 可以自定義設置路況顯示的顏色,四個參數,分別代表嚴重擁堵,擁堵,緩行,暢通
                    mapView.getMap().setCustomTrafficColor("#ffba0101", "#fff33131", "#ffff9e19", "#00000000");
                    // 對地圖狀態做更新,否則可能不會觸發渲染.造成自定義無效.
                    MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(13);
                    mapView.getMap().animateMapStatus(u);
                }else
                    mapView.getMap().setTrafficEnabled(false);
            }
        });

        cb_2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (b){
                    mapView.getMap().setBaiduHeatMapEnabled(true);
                }else
                    mapView.getMap().setBaiduHeatMapEnabled(false);
            }
        });
    }

    // 重寫父類方法,管理各部分生命周期.
    @Override
    protected void onResume() {
        mapView.onResume();
        super.onResume();

    }

    @Override
    protected void onPause() {
        mapView.onPause();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        locationClient.stop();
        mapView.getMap().setMyLocationEnabled(false);
        mapView.onDestroy();
        super.onDestroy();
    }
}


  • 演示

2019-4-20-05.gif

這里,由於模擬器是沒有gps定位模塊了,所以這里的定位是不准確的.這樣,一個基於百度地圖api的簡單地圖定位apk就算是完成了.

(這里,我在手機測試,發現定位並不是非常精確,之后會更新新版本,使其更加實用)


更新時間:
2019-4-21
0:44


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM