1 首先申請百度API key:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
2 將百度API文件拷貝至libs文件夾中(包括jar和so文件)
3 在AndroidManifest.xml中引入
<!-- 訪問網絡,進行地圖相關業務數據請求,包括地圖數據,路線規劃,POI檢索等 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 獲取網絡狀態,根據網絡狀態切換進行數據請求網絡轉換 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 讀取外置存儲。如果開發者使用了so動態加載功能並且把so文件放在了外置存儲區域,則需要申請該權限,否則不需要 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 寫外置存儲。如果開發者使用了離線地圖,並且數據寫在外置存儲區域,則需要申請該權限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="API key" > </meta-data> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
4 在build.gradle中 dependencies中加入
implementation fileTree(dir: 'libs' , include: ['*.jar']) androidTestCompile ('com.android.support.test.espresso: espresso-core: 2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' })
android中加入
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
此時編譯運行正常
5 activity_main.xml中加入baiduMap
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="0dp" android:layout_height="0dp" android:clickable="true" android:focusable="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0"> </com.baidu.mapapi.map.MapView>
6 創建地圖Activity,管理MapView生命週期
public class MainActivity extends Activity { private MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mMapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); } }
此時運行,如下圖所示
7 加入定位功能
(1) AndroidManifest 加入如下權限使用聲明
<!-- 這個權限用於進行網絡定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 這個權限用於訪問GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
(2) 在Application標籤中聲明定位的service組件
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
(3)開 啓地圖的定位圖層
mBaiduMap.setMyLocationEnabled(true);
(4) 構造地圖數據
public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { //mapView 銷燬後不在處理新接收的位置 if (location == null || mMapView == null){ return; } MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此處設置開發者獲取到的方向信息,順時針0-360 .direction(location.getDirection()).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); } }
(5) 通過LocationClient發起定位
//定位初始化 mLocationClient = new LocationClient(this); //通過LocationClientOption設置LocationClient相關參數 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); // 打開gps option.setCoorType("bd09ll"); // 設置座標類型 option.setScanSpan(1000); //設置locationClientOption mLocationClient.setLocOption(option); //註冊LocationListener監聽器 MyLocationListener myLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(myLocationListener); //開啓地圖定位圖層 mLocationClient.start();
8 需要添加以下權限,用於wifi sd卡等
//獲取設備的網絡狀態,鑑權所需網絡代理 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> //允許sd卡寫權限,需寫入地圖數據,禁用後無法顯示地圖 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> //允許sd卡讀權限,需讀取地圖數據,禁用後無法顯示地圖 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
此時運行時,可以在地圖上看到定位信息,但默認地圖不在光標處,在onReceiveLocation中加入如下代碼
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
//設置縮放中心點;縮放比例;
builder.target(ll).zoom(18.0f);
//給地圖設置狀態
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
此時初次啓動時,會定位至當前所在位置
9 添加復位、衛星模式、普通模式切換
在xml中加入三個按鈕,activity中加入響應事件
public void onResetClick(View view){
//把定位點再次顯現出來
LatLng ll = new LatLng(curLatitude, curLongitude);
MapStatus.Builder builder = new MapStatus.Builder();
//設置縮放中心點;縮放比例;
builder.target(ll).zoom(18.0f);
//給地圖設置狀態
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
public void onNormalClick(View view) {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
}
public void onSatelliteClick(View view) {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
}