说明:
集成百度地图,如果你看着开发文档集成,那么机会走很多弯路,百度地图的开发文档写的太简单,考虑的情况太少了。
因为百度第一的版本太多了,并且现在实行了定位、热力、全景的分包形式,所以如果你按照了开发文档说的下载了全量BaiduLBS_AndroidSDK同时又看了开发文档下载了定位sdk locSDK_6.13 那么你的项目必定冲突无法编译成功。
我的做法是:下载百度地图demo,完全按照demo进行开发。
百度地图Demo:
Demo地址:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
如果是AndroidStudio开发:建议参考demo中的 BaiduMap_AndroidSDK_v4.3.1_Sample-BaiduMapsApiASDemo 包名有可能根据实际情况二改变。
注意:
- libs的jar包一定和.so包对应。例如:locSDK_6.13.jar 一定 要对应 liblocSDK6a.so 否则 无法实现定位成功。
- 秘钥填写:发布版SHA1 和 开发版SHA1都要对应填写,否则直接用AndroidStudio运行的项目无法定位。
以上都会造成定位错误,定位会定位在非洲的海洋中。
参考Demo开发后的个人扩展代码记录:
1、配置秘钥AndroidManifest.xml
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- OpenGLES 2.0 --> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="false" android:resizeable="true" android:smallScreens="true" /> <!--baidu--> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你的key 或者 AK" /> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
2、导入.jar包和.so包
3、考入LocationDemo.java代码
package baidumapsdk.demo.map; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import baidumapsdk.demo.R; /** * 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置 同时展示如何使用自定义图标绘制并点击时弹出泡泡 */ public class LocationDemo extends Activity implements SensorEventListener { // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); private LocationMode mCurrentMode; BitmapDescriptor mCurrentMarker; private static final int accuracyCircleFillColor = 0xAAFFFF88; private static final int accuracyCircleStrokeColor = 0xAA00FF00; private SensorManager mSensorManager; private Double lastX = 0.0; private int mCurrentDirection = 0; private double mCurrentLat = 0.0; private double mCurrentLon = 0.0; private float mCurrentAccracy; MapView mMapView; BaiduMap mBaiduMap; // UI相关 OnCheckedChangeListener radioButtonListener; Button requestLocButton; boolean isFirstLoc = true; // 是否首次定位 private MyLocationData locData; private float direction; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location); requestLocButton = (Button) findViewById(R.id.button1); mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//获取传感器管理服务 mCurrentMode = LocationMode.NORMAL; requestLocButton.setText("普通"); OnClickListener btnClickListener = new OnClickListener() { public void onClick(View v) { switch (mCurrentMode) { case NORMAL: requestLocButton.setText("跟随"); mCurrentMode = LocationMode.FOLLOWING; mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); MapStatus.Builder builder = new MapStatus.Builder(); builder.overlook(0); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); break; case COMPASS: requestLocButton.setText("普通"); mCurrentMode = LocationMode.NORMAL; mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); MapStatus.Builder builder1 = new MapStatus.Builder(); builder1.overlook(0); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder1.build())); break; case FOLLOWING: requestLocButton.setText("罗盘"); mCurrentMode = LocationMode.COMPASS; mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker)); break; default: 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.setMyLocationConfiguration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker, accuracyCircleFillColor, accuracyCircleStrokeColor)); } } }; 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(); } @Override public void onSensorChanged(SensorEvent sensorEvent) { double x = sensorEvent.values[SensorManager.DATA_X]; if (Math.abs(x - lastX) > 1.0) { mCurrentDirection = (int) x; locData = new MyLocationData.Builder() .accuracy(mCurrentAccracy) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(mCurrentDirection).latitude(mCurrentLat) .longitude(mCurrentLon).build(); mBaiduMap.setMyLocationData(locData); } lastX = x; } @Override public void onAccuracyChanged(Sensor sensor, int i) { } /** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) { return; } mCurrentLat = location.getLatitude(); mCurrentLon = location.getLongitude(); mCurrentAccracy = location.getRadius(); locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(mCurrentDirection).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); 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())); } } public void onReceivePoi(BDLocation poiLocation) { } } @Override protected void onPause() { mMapView.onPause(); super.onPause(); } @Override protected void onResume() { mMapView.onResume(); super.onResume(); //为系统的方向传感器注册监听器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI); } @Override protected void onStop() { //取消注册传感器监听 mSensorManager.unregisterListener(this); super.onStop(); } @Override protected void onDestroy() { // 退出时销毁定位 mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; super.onDestroy(); } }
4、考入布局代码
1、参考BaiduMap_AndroidSDK_v4.3.1_Sample-BaiduMapsApiASDemo 的LocationDemo.java类实现了简单的定位。
2、不显示缩放控件activity_location.xml;主要的是MapView
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginTop="80dip" android:background="#D000" android:minWidth="100dip" android:orientation="vertical" android:padding="2dp" > <RadioGroup android:id="@+id/radioGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="定位icon" > <RadioButton android:id="@+id/defaulticon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="默认图标" > </RadioButton> <RadioButton android:id="@+id/customicon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定义图标" > </RadioButton> </RadioGroup> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="25dp" android:layout_marginTop="10dip" /> </RelativeLayout>
5、调试运行。
6、控件控制
mMapView.showZoomControls(false);//是否显示缩放控件