好记性不如铅笔头

android, 编程

Android应用开发笔记:百度地图Android SDK 的使用

最近用到了百度地图 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; 
	}
}

发表评论

14 − 4 =

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据