很多應用都有獲取自己位置的功能,比如QQ,微信等等都能獲取到自己的位置
一、核心類簡介
1.SDKInitializer:初始化SDK配置
2.MapView:地圖數據顯示
3.BaiduMap:控制地圖狀態
二、原理
Ⅰ.前期準備
jar包、庫文件引入,key值獲取
Ⅱ.地圖顯示
private BaiduMap baiduMap;
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSDK();
setContentView(R.layout.common);
init();
}
private void init() {
// BaiduMap 管理具體的某一個MapView 操作:旋轉、縮放、移動
mapView = (MapView) findViewById(R.id.mapview);
// mapView.showScaleControl(false);// 設置比例尺是否顯示 默認是true
// mapView.showZoomControls(false);// 設置縮放按鈕是否顯示 默認是true
baiduMap = mapView.getMap();
// 改變當前地圖的狀態
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 設置縮放到15級,默認是12級
baiduMap.setMapStatus(mapStatusUpdate);
// 設置中心點 默認是天安門
MapStatusUpdate mapStatusUpdatePoint = MapStatusUpdateFactory
.newLatLng(null);
baiduMap.setMapStatus(mapStatusUpdatePoint);
}
private void initSDK() {
// 初始化地圖引擎 校驗KEY
SDKInitializer.initialize(getApplicationContext());// 必須傳遞全局Context
//創建廣播,返回地圖打開狀態
IntentFilter filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
registerReceiver(new SDKBroadCast(), filter);
}
class SDKBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String result = intent.getAction();
// 網絡錯誤廣播
if (result.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
Toast.makeText(getApplicationContext(), "無網絡", Toast.LENGTH_SHORT).show();
}
// KEY 校驗失敗
else if (result.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
Toast.makeText(getApplicationContext(), "校驗失敗", Toast.LENGTH_SHORT).show();
}
}
}
/**
* MapView的生命週期與activity一致
*/
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
/**
* MapView的生命週期與activity一致
*/
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
/**
* MapView的生命週期與activity一致
*/
@Override
protected void onDestroy() {
mapView.onDestroy();
super.onDestroy();
}
1.首先初始化地圖引擎和校驗key值;並且註冊一個廣播接收者,接收校驗結果和網絡情況等
2.生成MapView(本質是百度提供的一個佈局文件),通過findViewById返回即可
3.通過mapView得到地圖狀態控制器BaiduMap
4.通過MapStatusUpdate設置地圖的狀態
5.把設置的狀態傳遞給baiduMap.setMapStatus()顯示出地圖
注意:
SDKInitializer校驗一定要儘早,否則會出現校驗信息還沒返回就請求數據的情況
MapView的聲明週期要和activity一樣,否則會有異常拋出
Ⅲ.設置我的位置
private void locate() {
LocationClient mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 設置定位模式
option.setCoorType("bd09ll");// 返回的定位結果是百度經緯度,默認值gcj02
option.setScanSpan(5000);// 設置發起定位請求的間隔時間爲5000ms
option.setIsNeedAddress(true);// 返回的定位結果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位結果包含手機機頭的方向
mLocationClient.setLocOption(option);
baiduMap.setMyLocationEnabled(true);// 打開定位圖層
//設置我的位置圖標
icon = BitmapDescriptorFactory
.fromResource(R.drawable.icon_geo);
MyLocationConfiguration config = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.NORMAL, true, icon);
baiduMap.setMyLocationConfigeration(config);
}
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation result) {
//得到我的位置數據
MyLocationData dada = new MyLocationData.Builder()
.latitude(result.getLatitude())// 設置緯度
.longitude(result.getLongitude())// 設置經度
.build();
baiduMap.setMyLocationData(dada);// 顯示定位信息 只有打開定位圖層 纔有效果
}
}
1.創建LocationClient對象(專門用於位置顯示類)
2.設置位置監聽器DBLocationListener
3.通過LocationClientOption設置一些顯示的數據
4.通過控制器baiduMap把設置的數據呈現在地圖上
三、小結
位置的顯示在很多app上應用都很廣泛,此外地圖還有一些其他的內容
1.圖層設置:衛星圖,交通圖,普通圖
2.覆蓋物:文字,Marker,泡泡顯示等等
3.搜索的設置:
興趣點:在一個範圍內搜索位置
路線:駕車,公交,步行
對於每一個內容百度都給出了相應的api來實現,用法都是大同小異的
剛開始接觸地圖的時候有點蒙逼,不過反覆看了看代碼,自己也敲了敲發現原來步驟都是固定的