Android 百度地圖最新SDK v3.2.0和Android定位SDK:v5.0應用(1)



以前的應用使用了百度的定位和百度地圖,Android5.0 不能安裝,出現了
Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=android.permission.BAIDU_LOCATION_SERVICE pkg=com.palmtrends.yl的錯誤。原來是android 5.0無法使用以前的百度定位SDK,所以決定重新寫一個使用百度地圖最新SDK的Demo。


2014年11月07日 百度地圖Android SDKv3.2.0發佈,2014年12月11日 Android定位SDK:v5.0產品上線,

新增:新增國外(全球)定位能力開放,直接替換開發包無需修改代碼;

優化:Android L 適配優化;

修復:修復GPS定位方式未返回地址的問題。

本demo使用的是最新的百度地圖AndroidSDK v3.2.0和Android定位SDK:v5.0。最後效果圖爲Android5.0.1上測試。


1.功能介紹

a  定位功能;
b  添加覆蓋物marker,彈出自定義佈局的InfoWindow及其點擊事件處理;
c  屏幕中心自定義View和PopupWindow,隨地圖移動顯示當前位置信息;




d  百度地圖POI範圍內檢索參數PoiBoundSearchOption和附近檢索參數PoiNearbySearchOption




2.申請密鑰和安全碼


3.第一個百度地圖

我這裏是直接把BaiduMapsApiDemo中的LocationDemo拷貝過來的,沒做任何修改,所以引用的是locSDK_3.1.jar和libBaiduMapSDK_v3_1_0.so,後面會換成最新的。

BaseMapActivity.java
public class BaseMapActivity extends Activity {

	 private static final String TAG = BaseMapActivity.class.getSimpleName();;
	// 定位相關
		LocationClient mLocClient;
		public MyLocationListenner myListener = new MyLocationListenner();
		private LocationMode mCurrentMode;
		BitmapDescriptor mCurrentMarker;

		MapView mMapView;
		BaiduMap mBaiduMap;

		// UI相關
		OnCheckedChangeListener radioButtonListener;
		Button requestLocButton;
		boolean isFirstLoc = true;// 是否首次定位

		@Override
		public void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.activity_location);
			requestLocButton = (Button) findViewById(R.id.button1);
			mCurrentMode = LocationMode.NORMAL;
			requestLocButton.setText("普通");
			OnClickListener btnClickListener = new OnClickListener() {
				public void onClick(View v) {
					switch (mCurrentMode) {
					case NORMAL:
						requestLocButton.setText("跟隨");
						mCurrentMode = LocationMode.FOLLOWING;
						mBaiduMap
								.setMyLocationConfigeration(new MyLocationConfiguration(
										mCurrentMode, true, mCurrentMarker));
						break;
					case COMPASS:
						requestLocButton.setText("普通");
						mCurrentMode = LocationMode.NORMAL;
						mBaiduMap
								.setMyLocationConfigeration(new MyLocationConfiguration(
										mCurrentMode, true, mCurrentMarker));
						break;
					case FOLLOWING:
						requestLocButton.setText("羅盤");
						mCurrentMode = LocationMode.COMPASS;
						mBaiduMap
								.setMyLocationConfigeration(new MyLocationConfiguration(
										mCurrentMode, true, mCurrentMarker));
						break;
					}
				}
			};
			requestLocButton.setOnClickListener(btnClickListener);

			RadioGroup group = (RadioGroup) this.findViewById(R.id.radioGroup);
			radioButtonListener = new OnCheckedChangeListener() {
				@Override
				public void onCheckedChanged(RadioGroup group, int checkedId) {
					if (checkedId == R.id.defaulticon) {
						// 傳入null則,恢復默認圖標
						mCurrentMarker = null;
						mBaiduMap
								.setMyLocationConfigeration(new MyLocationConfiguration(
										mCurrentMode, true, null));
					}
					if (checkedId == R.id.customicon) {
						// 修改爲自定義marker
						mCurrentMarker = BitmapDescriptorFactory
								.fromResource(R.drawable.icon_geo);
						mBaiduMap
								.setMyLocationConfigeration(new MyLocationConfiguration(
										mCurrentMode, true, mCurrentMarker));
					}
				}
			};
			group.setOnCheckedChangeListener(radioButtonListener);

			// 地圖初始化
			mMapView = (MapView) findViewById(R.id.bmapView);
			mBaiduMap = mMapView.getMap();
			// 開啓定位圖層
			mBaiduMap.setMyLocationEnabled(true);
			// 定位初始化
			mLocClient = new LocationClient(this);
			mLocClient.registerLocationListener(myListener);
			LocationClientOption option = new LocationClientOption();
			option.setOpenGps(true);// 打開gps
			option.setCoorType("bd09ll"); // 設置座標類型
			option.setScanSpan(1000);
			mLocClient.setLocOption(option);
			mLocClient.start();
		}

		/**
		 * 定位SDK監聽函數
		 */
		public class MyLocationListenner implements BDLocationListener {

			@Override
			public void onReceiveLocation(BDLocation location) {
				// map view 銷燬後不在處理新接收的位置
				if (location == null || mMapView == null)
					return;
				MyLocationData locData = new MyLocationData.Builder()
						.accuracy(location.getRadius())
						// 此處設置開發者獲取到的方向信息,順時針0-360
						.direction(100).latitude(location.getLatitude())
						.longitude(location.getLongitude()).build();
				mBaiduMap.setMyLocationData(locData);
				if (isFirstLoc) {
					isFirstLoc = false;
					LatLng ll = new LatLng(location.getLatitude(),
							location.getLongitude());
					MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
					mBaiduMap.animateMapStatus(u);
				}
			}

			public void onReceivePoi(BDLocation poiLocation) {
			}
		}

		@Override
		protected void onPause() {
			mMapView.onPause();
			super.onPause();
		}

		@Override
		protected void onResume() {
			mMapView.onResume();
			super.onResume();
		}

		@Override
		protected void onDestroy() {
			// 退出時銷燬定位
			mLocClient.stop();
			// 關閉定位圖層
			mBaiduMap.setMyLocationEnabled(false);
			mMapView.onDestroy();
			mMapView = null;
			super.onDestroy();
		}

	}

DemoApplication.java
public class DemoApplication extends Application {

	@Override
	public void onCreate() {
		super.onCreate();
		SDKInitializer.initialize(this);
	}

}

說明和注意事項:
a DemoApplication中的SDKInitializer.initialize(this)注意:在SDK各功能組件使用之前都需要調用,因此我們建議該方法放在Application的初始化方法中
也可以在應用程序創建時初始化SDK引用Context 全局變量:
public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext  
        //注意該方法要再setContentView方法之前實現  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
    }  
}
b 在application中添加開發密鑰和添加所需權限

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="開發者 key" />  
</application>

<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" />  
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

c 千萬別忘了
<application
        android:name="com.example.baiduMap.application.DemoApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        >



如果遇到

Couldn't load locSDK3 from loaderdalvik.system.PathClassLoader...的錯誤,可以在libs下再建一個armeabi-v7a的文件夾,把armeabi中的文件拷貝過去。如下圖:


其他就不做說明了,http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap講得很詳細。
最後效果:



Demo下載地址:http://download.csdn.net/detail/yalinfendou/8410587




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章