android 實現百度地圖app,android百度地圖app
以百度api為基礎
複製
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
要定義的變數
private BaiduMap mBaiduMap; private MapView mMapView; private LocationClient mLocationClient; private boolean isFirstIn = true;
初始化
mMapView= (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap();
各部分實現的功能
1.
//在使用SDK各組件之前初始化context資訊,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext());
把地圖的生命週期和activity的生命週期綁定起來
@Override protected void onStart() { super.onStart(); mBaiduMap.setMyLocationEnabled(true); if(!mLocationClient.isStarted()) mLocationClient.start(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mMapView.onPause(); }
實現option點擊轉換地圖模式
@Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub menu.add(0, 1, 0, "普通地圖"); menu.add(0, 2, 0, "衛星地圖"); menu.add(0, 3, 0, "即時交通(off)"); return super.onCreateOptionsMenu(menu); }
設定option的點擊事件
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: //普通地圖 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case 2: //衛星地圖 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case 3: if(mBaiduMap.isTrafficEnabled()){ mBaiduMap.setTrafficEnabled(false); item.setTitle("即時交通(off)"); }else{ mBaiduMap.setTrafficEnabled(true); item.setTitle("即時交通(on)"); } break; } return super.onOptionsItemSelected(item); }
在地圖上添加標識物
//定義Maker座標點 LatLng point = new LatLng(39.963175, 116.400244); //構建Marker表徵圖 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher); //構建MarkerOption,用於在地圖上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地圖上添加Marker,並顯示 mBaiduMap.addOverlay(option);
設定gps定位
要用到的類
LocationClient
BDLocationListener
(1)
MyLocationListener myLocationListener = new MyLocationListener(); mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類 mLocationClient.registerLocationListener(myLocationListener); //註冊監聽函數
(2)利用LocationClientOption 設定定位的屬性
LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);//設定定位元模式 option.setCoorType("bd09ll");//返回的定位結果是百度經緯度,預設值gcj02 option.setScanSpan(1000);//設定發起定位請求的間隔時間為5000ms option.setIsNeedAddress(true);//返回的定位結果包含地址資訊 option.setNeedDeviceDirect(true);//返回的定位結果包含手機機頭的方向 mLocationClient.setLocOption(option);
(3)監聽器的實現
private class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub MyLocationData data = new MyLocationData.Builder() //設定經緯度 .accuracy(location.getRadius()) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); mBaiduMap.setMyLocationData(data); //判斷第一次進入,定位到目前所在位置 if(isFirstIn){ LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate msu =MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.animateMapStatus(msu); Toast.makeText(getApplicationContext(), location.getAddrStr(),3000).show(); isFirstIn = false; } } }
所要加的許可權
<!-- 這個許可權用於進行網路定位--><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><!--允許應用讀取低層級的系統記錄檔 --><uses-permission android:name="android.permission.READ_LOGS"></uses-permission> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
所要在application聲明的
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="OSzBVaOV08hT2o7yNBIq4NFS" /> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>