官方文檔:http://lbsyun.baidu.com/index.php?title=android-locsdk
1.獲取AK
發佈版:
keytool -v -list -keystore key.jks
SHA1:A9:7D:70:70:4C:67:83:71:AC:FD:18:6E:EF:9B:08:FF:CF:07:A6:BD
開發版:
keytool -v -list -keystore debug.keystore
SHA1:39:FC:60:2A:FA:CB:BF:6C:79:CA:98:58:C6:2F:F8:58:FE:56:24:2F
2.創建定位測試項目
1)AndroidManifest.xml
增加權限,聲明service和ak鑑權
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<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" >
</uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<uses-permission android:name="android.permission.VIBRATE" >
</uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS" >
</uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 聲明service組件 -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<!-- AK鑑權 -->
<!-- meta-data需要寫在application中 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="V57HWvyoHwUYEK15Nws2kAZYvSwWtC2q" />
2)導入項目所需的jar包和so
BaiduLBS_Android.jar
libBaiduMapSDK_base_v4_5_2.so
libBaiduMapSDK_map_v4_5_2.so
liblocSDK7b.so
在app的build.gradle android{}中說明so爲該libs路徑
android {
...
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
}
3.定位流程
1)初始化LocationClient類
LocationClient類最好在主線程中聲明,需要Context類型的參數。
Context需要時全進程有效的Context,推薦用getApplicationConext獲取全進程有效的Context
mLocClient = new LocationClient(getApplicationContext());
mLocClient.registerLocationListener(listener);
2)配置SDK參數
LocationClientOption option = new LocationClientOption();
option.setIsNeedAddress(true);//是否要地址
option.setOpenGps(true);
option.setCoorType("bd09ll"); // 設置座標類型
option.setScanSpan(1000);//可選,默認0,即僅定位一次,設置發起連續定位請求的間隔需要大於等於1000ms纔是有效的
mLocClient.setLocOption(option);
mLocClient.start();
3)實現BDAbstractLocationListener接口
Android定位SDK自v7.2版本起,對外提供了Abstract類型的監聽接口BDAbstractLocationListener,用於實現定位監聽。原有BDLocationListener暫時保留,推薦開發者升級到Abstract類型的新監聽接口使用,該接口會異步獲取定位結果
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.i("bdmap","定位類型:"+bdLocation.getLocTypeDescription()+"\n"
+"緯度:"+bdLocation.getLatitude()+"\n"
+"經度:"+bdLocation.getLongitude()+"\n"
+"詳細地址:"+bdLocation.getAddrStr()+"\n"
+"衛星數目"+bdLocation.getSatelliteNumber());
}
輸出:
I/bdmap: 定位類型:GPS location successful!
緯度:30.555669
經度:104.075068
詳細地址:中國四川省成都市武侯區G213(xxxxxx)
衛星數目4
4.增加Mark
LatLng ll = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_openmap_mark);
// 構建MarkerOption,用於在地圖上添加Marker
OverlayOptions option = new MarkerOptions()
.position(ll) //mark出現的位置
.icon(bitmap) //mark圖標
.draggable(true);//mark可拖動
//在地圖上添加Marker並顯示
mBaiduMap.addOverlay(option);
//對Marker的點擊事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//獲取marker中的數據
double lat = marker.getPosition().latitude;
double log = marker.getPosition().longitude;
Toast.makeText(getApplication(),
"經度"+log+" 緯度"+lat,Toast.LENGTH_LONG)
.show();
return false;
}
});
5.Demo
public class MainActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
boolean isFirstLoc = true; // 是否首次定位
LocationClient mLocClient;
private MyLocationData locData; //定位數據包
private Marker marker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mMapView = (MapView)findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//設置類型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));
// 開啓定位圖層
mBaiduMap.setMyLocationEnabled(true);
mLocClient = new LocationClient(getApplicationContext());
mLocClient.registerLocationListener(listener);
LocationClientOption option = new LocationClientOption();
option.setIsNeedAddress(true);//是否要地址
option.setOpenGps(true);
option.setCoorType("bd09ll"); // 設置座標類型
option.setScanSpan(1000);//可選,默認0,即僅定位一次,設置發起連續定位請求的間隔需要大於等於1000ms纔是有效的
mLocClient.setLocOption(option);
mLocClient.start();
//對Marker的點擊事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//獲取marker中的數據
double lat = marker.getPosition().latitude;
double log = marker.getPosition().longitude;
Toast.makeText(getApplication(),
"經度"+log+" 緯度"+lat,Toast.LENGTH_LONG)
.show();
return false;
}
});
//Map點擊事件,點擊地圖移除marker
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
marker.remove();//移除marker
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
}
/***
* 定位結果回調,在此方法中處理定位結果
*/
BDAbstractLocationListener listener = new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.i("bdmap","定位類型:"+bdLocation.getLocTypeDescription()+"\n"
+"緯度:"+bdLocation.getLatitude()+"\n"
+"經度:"+bdLocation.getLongitude()+"\n"
+"詳細地址:"+bdLocation.getAddrStr()+"\n"
+"衛星數目"+bdLocation.getSatelliteNumber());
//構造定位數據
locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
.latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude())
.build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_openmap_mark);
// 構建MarkerOption,用於在地圖上添加Marker
OverlayOptions option = new MarkerOptions()
.position(ll) //mark出現的位置
.icon(bitmap) //mark圖標
.draggable(true);//mark可拖動
//在地圖上添加Marker並顯示
marker = (Marker) mBaiduMap.addOverlay(option);
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(17.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
};
@Override
protected void onDestroy() {
//退出時銷燬定位
mLocClient.stop();
//關閉定位圖層
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
}