最近用到了百度地图 android sdk ,现在备忘下使用方法。
百度地图AndroidSDK的网址:
【 http://developer.baidu.com/map/sdk-android.htm 】
CONTENTS
HelloWord:
1)申请密钥
这个步骤和使用【 android定位sdk 】中一样,就不在细说了。
2)添加相应的so和jar文件。
3) 添加权限和代码。
权限:(此处也包含了 定位sdk 的权限)
<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 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.ACCESS_GPS" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> </uses-permission> <supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:resizeable="true" android:anyDensity="true"/>
布局文件:
<com.baidu.mapapi.map.MapView android:id="@+id/bdmapview" android:layout_below="@+id/tv_currloc" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
Java:
申请两个成员变量:
private BMapManager mBMapMan = null; private MapView mMapView = null;
OnCreate:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //注意:请在试用setContentView前初始化BMapManager对象,否则会报错 mBMapMan=new BMapManager(getApplicationContext()); mBMapMan.init("F0488f2ee7d14e2bba215419efb9bff3", null); setContentView(R.layout.activity_main); mMapView=(MapView)findViewById(R.id.bdmapview); mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 MapController mMapController=mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) mMapController.setCenter(point);//设置地图中心点 mMapController.setZoom(12);//设置地图zoom级别 }
重写Activity的函数:
@Override protected void onDestroy(){ mMapView.destroy(); if(mBMapMan!=null){ mBMapMan.destroy(); mBMapMan=null; } super.onDestroy(); } @Override protected void onPause(){ mMapView.onPause(); if(mBMapMan!=null){ mBMapMan.stop(); } super.onPause(); } @Override protected void onResume(){ mMapView.onResume(); if(mBMapMan!=null){ mBMapMan.start(); } super.onResume(); }
总结:
1)百度地图sdk的文档还是比较全的,demo也介绍的很详细。
2)官方helloword:【 http://developer.baidu.com/map/sdkandev-2.htm 】
3)官方类参考:【 http://developer.baidu.com/map/android_refer/index.html 】
更新:将定位信息和百度定位sdk结合在一起
根据官网的介绍,百度地图sdk是由多个地图图层叠加在一起的。因此如果要显示定位信息,只要将图层添加到view中即可。
根据官方demo【 LocationOverlayDemo.java 】,我们可以实现自己的一个非常简单的定位功能。
部分代码如下:
public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity"; private LocationClient mLocationClient = null; private BMapManager mBMapMan = null; private MapView mMapView = null; private MapController mMapController = null; private MyLocationOverlay myLocationOverlay = null; private LocationData locData = null; private BDLocationListener bdLocationListener = new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { if (location == null) return; locData.latitude = location.getLatitude(); locData.longitude = location.getLongitude(); //如果不显示定位精度圈,将accuracy赋值为0即可 locData.accuracy = location.getRadius(); locData.direction = location.getDerect(); //更新定位数据 myLocationOverlay.setData(locData); //更新图层数据执行刷新后生效 mMapView.refresh(); //移动到定位点 /* 在罗盘和跟随模式下,地图会自动的animate到最新的位置,在普通模式下,不会。 */ mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude * 1e6))); } @Override public void onReceivePoi(BDLocation poiLocation) {} }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //注意:请在试用setContentView前初始化BMapManager对象,否则会报错 mBMapMan=new BMapManager(getApplicationContext()); mBMapMan.init("F0488f2ee7d14e2bba215419efb9bff3", null); setContentView(R.layout.activity_main); mMapView=(MapView)findViewById(R.id.bdmapview); mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 mMapController=mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) mMapController.setCenter(point);//设置地图中心点 mMapController.setZoom(12);//设置地图zoom级别 locData = new LocationData(); //定位图层初始化 myLocationOverlay = new MyLocationOverlay(mMapView); //设置定位数据 myLocationOverlay.setData(locData); //添加定位图层 mMapView.getOverlays().add(myLocationOverlay); myLocationOverlay.enableCompass(); myLocationOverlay.setLocationMode(LocationMode.COMPASS); //修改定位数据后刷新图层生效 mMapView.refresh(); } }
总结:
通过代码可以看出,定位图层很简单:
新建一个图层->放入view中,并刷新。->在定位的回调中更新位置信息
更新:将百度定位sdk截屏并分享。
通过查看官网的API介绍,我们发现MapView有一个方法可以实现截屏的功能( getCurrentMap() ),具体调用方式备忘如下:
1)在Activity中实现一个接口,MKMapViewListener:
@Override private MKMapViewListener mKMapViewListener = new MKMapViewListener() { public void onMapMoveFinish() {} @Override public void onMapLoadFinish() {} @Override public void onMapAnimationFinish() {} @Override public void onGetCurrentMap(Bitmap arg0) { Bitmaps.writeBitmapToFile(arg0, "/mnt/sdcard/map.png"); } @Override public void onClickMapPoi(MapPoi arg0) {} };
因为我们直接屏幕,所以只实现一个方法。
2)注册接口:
mMapView.regMapViewListener(mBMapMan, mKMapViewListener);
3)调用方法截屏:
mMapView.getCurrentMap();
4)将bitmap保存在文件中。
public class Bitmaps { public static boolean writeBitmapToFile(Bitmap map, String filePath) { if (null == map || null == filePath) { return false; } FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(filePath); } catch (FileNotFoundException e) { e.printStackTrace(); return false; } map.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); boolean result = true; try { fileOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); result = false; } try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); result = false; } return result; } }
5)分享
public class ShareUtils { public static boolean simpleShare(Context context, String text, String ImagePath) { if (null == text || text.trim().length() == 0) { return false; } Intent intent=new Intent(Intent.ACTION_SEND); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_SUBJECT, "share"); intent.putExtra(Intent.EXTRA_TITLE, "title"); intent.putExtra(Intent.EXTRA_TEXT, text); intent.setType("text/plain"); if (ImagePath != null && ImagePath.trim().length() != 0) { File file = new File(ImagePath.trim()); if (file.canRead()) { intent.setType("image/*"); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); } } context.startActivity(intent); return true; } }
发表评论