百度地圖定位開發流程
百度地圖是我們日常生活中必不可少的,他能幫助我們找到自己想去的地方,方便出行等等。
下面我就來介紹一下怎樣去使用百度地圖來實現自定位功能,跟著我的思路往下走。。。。。。
選中導航欄的開發文件再點開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 這段程式碼必須設定,這個是開啟定位功能。
好了,百度地圖的自定位功能基本上就是這些了,是不是很簡單呢,確實,你也可以上百度地圖的官網的開發者文件中跟著步驟一步一步整合。如果喜歡點波關注謝謝!!!