1. 程式人生 > >百度地圖定位開發流程

百度地圖定位開發流程

 百度地圖是我們日常生活中必不可少的,他能幫助我們找到自己想去的地方,方便出行等等。

 下面我就來介紹一下怎樣去使用百度地圖來實現自定位功能,跟著我的思路往下走。。。。。。

選中導航欄的開發文件再點開Android定位SDK,再根據官網的流程講解,一步一步的跟著他的步驟做就可以了。  首先,我們要獲取一個密匙來呼叫百度地圖的SDK,其中需要獲取安全碼  獲取安全碼:  使用jdk的keytool工具獲取sha1指紋,輸入keytool -list -v -keystore debug.keystore  ,debug.keystore的金鑰庫口令預設為“android”    操作示例:  開啟cmd控制檯  C:\Users\willkong>cd .android

C:\Users\willkong.android>keytool -list -v -keystore debug.keystore  輸入金鑰庫口令:

金鑰庫型別: JKS  金鑰庫提供方: SUN

您的金鑰庫包含 1 個條目

別名: androiddebugkey  建立日期: 2016-7-29  條目型別: PrivateKeyEntry  證書鏈長度: 1  證書[1]:  所有者: C=US, O=Android, CN=Android Debug  釋出者: C=US, O=Android, CN=Android Debug  序列號: 1  有效期開始日期: Fri Jul 29 23:27:59 CST 2016, 截止日期: Sun Jul 22 23:27:59 CST  2046  證書指紋:           MD5: AB:6B:65:37:46:32:E4:DB:E2:70:23:83:EB:1F:53:A2           SHA1: EE:C2:F3:D1:69:ED:DD:9B:83:2D:BA:FB:82:33:1A:A9:D7:06:54:0E           SHA256: FF:36:EC:EB:96:BB:65:06:C8:C4:91:D0:AD:B9:8B:63:E3:C7:B0:06:C7:  53:6F:8A:0C:4D:1C:FB:B9:9B:1F:28 

注意:  執行百度地圖的Demo的時候,在key正確的情況下,出現出現230錯誤,key校驗失敗的時候,解決方法是:  我們的sha1值是通過keystore檔案獲取的,而百度地圖demo中用的是自己的keystore檔案,在百度地圖Demo的app資料夾下找到了debug.keystore檔案,把這個刪除了複製了一份.android 資料夾下的debug.keystore檔案,再次build,重新執行,就OK了。

下面就配置我們的開發工程。在Android studio新建一個工程 1、在src的main目錄下新建一個jniLibs目錄,把從官網下載下來的開發包複製到這個目錄下。如下圖:

這裡寫圖片描述

2、新增AK(新增我們申請到的呼叫密匙)

在Application標籤中增加如下程式碼:

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="開發者申請的AK" >
</meta-data>

3、新增定位許可權

使用定位SDK,需在Application標籤中宣告service元件,每個App擁有自己單獨的定位service,程式碼如下:

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>

除新增service元件外,使用定位SDK還需新增如下許可權:

<!-- 這個許可權用於進行網路定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 這個許可權用於訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用於訪問wifi網路資訊,wifi資訊會用於進行網路定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 獲取運營商資訊,用於支援提供運營商資訊相關的介面-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 這個許可權用於獲取wifi的獲取許可權,wifi資訊會用來進行網路定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用於讀取手機當前的狀態-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 寫入擴充套件儲存,向擴充套件卡寫入資料,用於寫入離線定位資料-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 訪問網路,網路定位需要上網-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取許可權,使用者寫入離線定位資料-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

這裡我們先集合進百度地圖sdk 1、新增地圖所需許可權

<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" /> 
//獲取裝置的網路狀態,鑑權所需網路代理
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
//允許sd卡寫許可權,需寫入地圖資料,禁用後無法顯示地圖
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
//獲取統計資料
<uses-permission android:name="android.permission.GET_TASKS" /> 
//鑑權所需該許可權獲取程序列表
<uses-permission android:name="android.permission.CAMERA" />  
//使用步行AR導航,配置Camera許可權

2、在佈局activity_main.xml檔案中新增地圖控制元件;

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.mybaidumap.HelloBaiduMapActivity">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

</android.support.constraint.ConstraintLayout>

3、在應用程式建立時初始化 SDK引用的Context 全域性變數;建立一個MyApplication類繼承Application

package com.mybaidumap;

import android.app.Application;
import com.baidu.mapapi.SDKInitializer;
public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        //在使用SDK各元件之前初始化context資訊,傳入ApplicationContext
        //注意該方法要再setContentView方法之前實現
        SDKInitializer.initialize(getApplicationContext());
    }
}

4、建立一個應用百度地圖的Activity基類BaseActivity

package com.mybaidumap;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;

public abstract class BaseActivity extends Activity{
    private static final String TAG = "BaseActivity";

    protected LatLng hmPos = new LatLng(40.050513, 116.30361);

    protected LatLng czPos = new LatLng(40.065817,116.349902);
    /** 天安門座標 */
    protected LatLng tamPos = new LatLng(39.915112,116.403963);
    /**卓越世紀中心1號樓座標*/
    protected LatLng zysjzxPos = new LatLng(114.070427,22.537591);
    protected MapView mMapView;
    protected BaiduMap baiduMap;

    //這裡加final是為了不讓子類覆蓋,原因是為了預防這裡的一些類還沒初始化的時候就被子類呼叫
    @Override
    protected final void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //獲取地圖控制元件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        baiduMap = mMapView.getMap();//獲取地圖控制器
        //1、隱藏縮放按鈕,比例尺
//        mMapView.showScaleControl(false);//隱藏比例按鈕,預設是顯示的
//        mMapView.showZoomControls(false);//隱藏縮放按鈕,預設是顯示的
        //2、獲取最小(3)、最大縮放級別(22)
        float maxZoomLevel = baiduMap.getMaxZoomLevel();//獲取地圖最大縮放級別
        float minZoomLevel = baiduMap.getMinZoomLevel();//獲取地圖最小縮放級別
        Log.e(TAG,"minZoomLevel ="+minZoomLevel+",maxZoomLevel="+maxZoomLevel);//最小為3,最大為22
        //3、設定地圖中心為
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(hmPos);
        baiduMap.setMapStatus(mapStatusUpdate);
        //4、設定地圖縮放為15
        mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);
        baiduMap.setMapStatus(mapStatusUpdate);
        //6.獲取地圖Ui控制器:隱藏指南針
//        UiSettings uiSettings = baiduMap.getUiSettings();
//        uiSettings.setCompassEnabled(false);//不顯示指南針
        init();
    }

    /**
     * 子類實現此方法
     */
    public abstract void init();

    /**
     * 在螢幕中央顯示一個Toast
     * @param text
     */
    public void showToast(CharSequence text){
        Utils.showToast(this,text);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.onResume();
    }

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }
}

5、建立一個定位Activity類LocationActivity

package com.mybaidumap;

import android.util.Log;
import android.view.KeyEvent;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;

import java.util.List;

public class LocationActivity extends BaseActivity {
    private static final String TAG = "LocationActivity";
    public LocationClient mLocationClient = null;
    private MyLocationListener myListener = new MyLocationListener();
    public class MyLocationListener extends BDAbstractLocationListener{
        @Override
        public void onReceiveLocation(BDLocation location){
            if (location!=null){
                MyLocationData.Builder builder = new MyLocationData.Builder();
                builder.accuracy(location.getRadius());//設定精度
                builder.direction(location.getDirection());//設定方向
                builder.latitude(location.getLatitude());//設定緯度
                builder.longitude(location.getLongitude());//設定經度
                MyLocationData locationData = builder.build();
                baiduMap.setMyLocationData(locationData);//把定位資料顯示到地圖上
            }
            //此處的BDLocation為定位結果資訊類,通過它的各種get方法可獲取定位相關的全部結果
            //以下只列舉部分獲取經緯度相關(常用)的結果資訊
            //更多結果資訊獲取說明,請參照類參考中BDLocation類中的說明

            double latitude = location.getLatitude();    //獲取緯度資訊
            double longitude = location.getLongitude();    //獲取經度資訊
            float radius = location.getRadius();    //獲取定位精度,預設值為0.0f

            String coorType = location.getCoorType();
            //獲取經緯度座標型別,以LocationClientOption中設定過的座標型別為準

            int errorCode = location.getLocType();
            //獲取定位型別、定位錯誤返回碼,具體資訊可參照類參考中BDLocation類中的說明
            Log.e(TAG,"經度="+longitude+",緯度="+latitude+",錯誤碼="+errorCode);

            //此處的BDLocation為定位結果資訊類,通過它的各種get方法可獲取定位相關的全部結果
            //以下只列舉部分獲取地址相關的結果資訊
            //更多結果資訊獲取說明,請參照類參考中BDLocation類中的說明

            String addr = location.getAddrStr();    //獲取詳細地址資訊
            String country = location.getCountry();    //獲取國家
            String province = location.getProvince();    //獲取省份
            String city = location.getCity();    //獲取城市
            String district = location.getDistrict();    //獲取區縣
            String street = location.getStreet();    //獲取街道資訊
            Log.e(TAG,"addr:"+addr+",country:"+country
                    +",province:"+province+",city:"+city
                    +",district:"+district+",street:"+street);

            String locationDescribe = location.getLocationDescribe();    //獲取位置描述資訊
            Log.e(TAG,"位置描述:"+locationDescribe);

            List<Poi> poiList = location.getPoiList();
            //獲取周邊POI資訊
            //POI資訊包括POI ID、名稱等,具體資訊請參照類參考中POI類的相關說明
            for (int i=0;i<poiList.size();i++){
                Log.e(TAG,"興趣點:"+poiList.get(i).getName()+"\n");
            }
        }
    }

    @Override
    public void init() {
        mLocationClient = new LocationClient(getApplicationContext());//宣告LocationClient類
        mLocationClient.registerLocationListener(myListener);//註冊監聽函式
        initLocation();
        baiduMap.setMyLocationEnabled(true);//開啟定點陣圖層
        MyLocationConfiguration.LocationMode mode = MyLocationConfiguration.LocationMode.COMPASS;
        setMyLocationConfigeration(mode);
        mLocationClient.start();
    }

    /**
     * 設定定點陣圖層的配置
     * @param mode
     */
    private void setMyLocationConfigeration(MyLocationConfiguration.LocationMode mode) {
        boolean enableDirection = true;//設定顯示方向
        BitmapDescriptor customMarker = BitmapDescriptorFactory.fromResource(R.mipmap.icon_geo);//自定義定位的圖示
        MyLocationConfiguration locationConfiguration = new MyLocationConfiguration(mode,enableDirection,customMarker);
        baiduMap.setMyLocationConfiguration(locationConfiguration);
    }

    /**
     * 初始化定位
     */
    private void initLocation() {
        LocationClientOption option = new LocationClientOption();

        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可選,設定定位模式,預設高精度
        //LocationMode.Hight_Accuracy:高精度;
        //LocationMode. Battery_Saving:低功耗;
        //LocationMode. Device_Sensors:僅使用裝置;

        option.setCoorType("bd09ll");
        //可選,設定返回經緯度座標型別,預設gcj02
        //gcj02:國測局座標;
        //bd09ll:百度經緯度座標;
        //bd09:百度墨卡託座標;
        //海外地區定位,無需設定座標型別,統一返回wgs84型別座標

        option.setScanSpan(5000);
        //可選,設定發起定位請求的間隔,int型別,單位ms
        //如果設定為0,則代表單次定位,即僅定位一次,預設為0
        //如果設定非0,需設定1000ms以上才有效

        option.setOpenGps(true);
        //可選,設定是否使用gps,預設false
        //使用高精度和僅用裝置兩種定位模式的,引數必須設定為true

        option.setLocationNotify(true);
        //可選,設定是否當GPS有效時按照1S/1次頻率輸出GPS結果,預設false

        option.setIgnoreKillProcess(false);
        //可選,定位SDK內部是一個service,並放到了獨立程序。
        //設定是否在stop的時候殺死這個程序,預設(建議)不殺死,即setIgnoreKillProcess(true)

        option.SetIgnoreCacheException(false);
        //可選,設定是否收集Crash資訊,預設收集,即引數為false

        option.setWifiCacheTimeOut(5 * 60 * 1000);
        //可選,7.2版本新增能力
        //如果設定了該介面,首次啟動定位時,會先判斷當前WiFi是否超出有效期,若超出有效期,會先重新掃描WiFi,然後定位

        option.setEnableSimulateGps(false);
        //可選,設定是否需要過濾GPS模擬結果,預設需要,即引數為false

        option.setIsNeedAddress(true);
        //可選,是否需要地址資訊,預設為不需要,即引數為false
        //如果開發者需要獲得當前點的地址資訊,此處必須為true

        option.setIsNeedLocationDescribe(true);
        //可選,是否需要位置描述資訊,預設為不需要,即引數為false
        //如果開發者需要獲得當前點的位置資訊,此處必須為true

        option.setIsNeedLocationPoiList(true);
        //可選,是否需要周邊POI資訊,預設為不需要,即引數為false
        //如果開發者需要獲得周邊POI資訊,此處必須為true

        mLocationClient.setLocOption(option);
        //mLocationClient為第二步初始化過的LocationClient物件
        //需將配置好的LocationClientOption物件,通過setLocOption方法傳遞給LocationClient物件使用
        //更多LocationClientOption的配置,請參照類參考中LocationClientOption類的詳細說明
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode){
            case KeyEvent.KEYCODE_1://羅盤態:顯示定位方向圈,保持定點陣圖標在地圖中心
                setMyLocationConfigeration(MyLocationConfiguration.LocationMode.COMPASS);
                break;
            case KeyEvent.KEYCODE_2://跟隨態:保持定點陣圖標在地圖中心
                setMyLocationConfigeration(MyLocationConfiguration.LocationMode.FOLLOWING);
                break;
            case KeyEvent.KEYCODE_3://普通態:更新定位資料時不對地圖做任何操作
                setMyLocationConfigeration(MyLocationConfiguration.LocationMode.NORMAL);
                break;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        super.onDestroy();
    }
}

程式碼中需要注意的是option.setIsNeedAddress(true); //可選,是否需要地址資訊,預設為不需要,即引數為false //如果開發者需要獲得當前點的地址資訊,此處必須為true 這段程式碼必須設定,這個是開啟定位功能。

好了,百度地圖的自定位功能基本上就是這些了,是不是很簡單呢,確實,你也可以上百度地圖的官網的開發者文件中跟著步驟一步一步整合。如果喜歡點波關注謝謝!!!