android开发中,截取百度地图的方法

有时候我们会遇到要截取地图的情况,下面就百度地图的截图来简单的写一下。

下面直接上代码(注册百度地图开发者账号,创建一个应用,获得Appkey):

用到的jar包及目录结构:


libs文件下载地址:http://pan.baidu.com/s/1bompnif    提取码:bwlq

代码:

a:AndroidManifest.xml

清单文件中添加所需权限:

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_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.CALL_PHONE"></uses-permission>
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></permission>
<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCES_MOCK_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS" />

添加服务:

 <service android:name="com.baidu.location.f" 

                        android:enabled="true"
android:process=":remote">
</service>

b:创建BaiduApp.java,继承Application,实现对地图的管理:

public class BaiduApp extends Application {

private static MyBaiduApp mInstance = null;
public boolean m_bKeyRight = true;
BMapManager mBMapManager = null;

public static final String strKey = "2621E561945597BBE213F4208E2CAAB74DA1B57F";//AppKey
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
mInstance = this;
initEngineManager(this);


public void initEngineManager(Context context) {
if (mBMapManager == null) {
mBMapManager = new BMapManager(context);
}

if (!mBMapManager.init(strKey, new MyGeneralListener())) {
Toast.makeText(MyBaiduApp.getInstance().getApplicationContext(), "BMapManager  初始化错误!", Toast.LENGTH_LONG)
.show();
}
}

@Override
// 建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
public void onTerminate() {
if (mBMapManager != null) {
mBMapManager.destroy();
mBMapManager = null;
}
super.onTerminate();
}

public static MyBaiduApp getInstance() {
return mInstance;
}

// 常用事件监听,用来处理通常的网络错误,授权验证错误等
static class MyGeneralListener implements MKGeneralListener {
@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(MyBaiduApp.getInstance().getApplicationContext(), "您的网络出错啦!", Toast.LENGTH_LONG).show();
} else if (iError == MKEvent.ERROR_NETWORK_DATA) {
Toast.makeText(MyBaiduApp.getInstance().getApplicationContext(), "输入正确的检索条件!", Toast.LENGTH_LONG)
.show();
}
}
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
// 授权Key错误:
Toast.makeText(MyBaiduApp.getInstance().getApplicationContext(), "请在 DemoApplication.java文件输入正确的授权Key!",
Toast.LENGTH_LONG).show();
MyBaiduApp.getInstance().m_bKeyRight = false;
}
}
}
}

c:DensityUtil.java优化截图效果

/*
 * 屏幕分辨率获取的类
 */
public class DensityUtil {
private static int[] deviceWidthHeight = new int[2];

public static int[] getDeviceInfo(Context context) {
if ((deviceWidthHeight[0] == 0) && (deviceWidthHeight[1] == 0)) {
DisplayMetrics metrics = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metrics);

deviceWidthHeight[0] = metrics.widthPixels;
deviceWidthHeight[1] = metrics.heightPixels;
}
return deviceWidthHeight;
}

/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}

d:Config.java类,

public class Config {
public static int[] deviceWidthHeight ;
}

e:BitmapUtils.java,截图的加载

public class BitmapUtils {
public static Bitmap drawableToBitamp(Drawable drawable) {
Bitmap bitmap = null;
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
bitmap = Bitmap.createBitmap(w, h, config);
// 注意,下面三行代码要用到,否在在View或者surfaceview里的canvas.drawBitmap会看不到图
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(canvas);
return bitmap;
}
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}

f:BaiduActivity.java

public class BaiduActivity extends Activity {
private MapView mMapView = null;
MyBaiduApp app;
private ImageView pos_IV;
private MapController mMapController = null;
MKMapViewListener mMapListener = null;
// 定位相关
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
MKSearch mMKSearch;
LocationData locData = null;
GeoPoint geoPoint;// 当前位置


MyLocationOverlay myLocationOverlay = null;
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 定位当前位置调用reverseGeocode方法获取实现接口类里的当前位置Toast信息
mMKSearch.reverseGeocode(geoPoint);
};
};


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


setContentView(R.layout.activity_baidu);
findViews();
setApp();
initMapView();
getListener();
setListener();
getMapClient();
}


/*
* 获取监听
*/
private void getListener() {
mMapListener = new MKMapViewListener() {


@Override
public void onMapMoveFinish() {
// T在此处理地图移动完成消息回调
}


@Override
public void onClickMapPoi(MapPoi mapPoiInfo) {


// TODO Auto-generated method stub
String title = "";
if (mapPoiInfo != null) {
title = mapPoiInfo.strText;
Toast.makeText(BaiduActivity.this, title, Toast.LENGTH_SHORT).show();
}
}


@Override
public void onGetCurrentMap(Bitmap bitmap) {
// 回调图片数据,保存在"/mnt/sdcard/test"目录下
System.out.println("test" + "onGetCurrentMap");
File file = new File("/mnt/sdcard/baidupos.png");
FileOutputStream out;
try {
out = new FileOutputStream(file);
// 获取状态栏高度
Rect frame = new Rect();
BaiduActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
bitmap = Bitmap.createBitmap(bitmap,
Integer.parseInt("" + (Config.deviceWidthHeight[0] / 2 - Config.deviceWidthHeight[0] / 6)),
Integer.parseInt("" + (Config.deviceWidthHeight[1] / 2 - Config.deviceWidthHeight[0] / 6
- statusBarHeight / 2)),
Config.deviceWidthHeight[0] / 3, Config.deviceWidthHeight[0] / 3);
pos_IV.setImageBitmap(BitmapUtils.toRoundCorner(bitmap, 15));
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


@Override
public void onMapAnimationFinish() {
// TODO Auto-generated method stub


}
};


}


public class MyMKSearchListener implements MKSearchListener {


@Override
public void onGetAddrResult(MKAddrInfo res, int error) {
// 获取地理位置信息
if (error != 0) {
String str = String.format("错误号:%d", error);
return;
}
String posInfo = String.format("纬度:%f 经度:%f 地址:%s\r\n", res.geoPt.getLatitudeE6() / 1e6,
res.geoPt.getLongitudeE6() / 1e6,
res.addressComponents.city + res.addressComponents.district + res.addressComponents.street);
Toast.makeText(BaiduActivity.this, posInfo, 1).show();
}


@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
// TODO Auto-generated method stub


}


@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub


}


@Override
public void onGetPoiDetailSearchResult(int arg0, int arg1) {
// TODO Auto-generated method stub


}


@Override
public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
// TODO Auto-generated method stub


}


@Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub


}


@Override
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
// TODO Auto-generated method stub


}


@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub


}


}


private void getMapClient() {
myLocationOverlay = new MyLocationOverlay(mMapView);
locData = new LocationData();
myLocationOverlay.setData(locData);
mMapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
mMapView.refresh();
}


/*
* 设置监听
*/
private void setListener() {


mMapView.regMapViewListener(MyBaiduApp.getInstance().mBMapManager, mMapListener);


}


/**
* 监听函数,又新位置的时候,格式化成字符串,输出到屏幕中
*/
public class MyLocationListenner implements BDLocationListener {


@Override
public void onReceiveLocation(BDLocation location) {
if (location == null) {


return;
}
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.accuracy = location.getRadius();
locData.direction = location.getDerect();
myLocationOverlay.setData(locData);
mMapView.refresh();
geoPoint = new GeoPoint((int) (locData.latitude * 1e6), (int) (locData.longitude * 1e6));
mMapController.animateTo(geoPoint, mHandler.obtainMessage(1));
}


public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
return;
}
}
}


/*
* 获取控件
*/
private void findViews() {
mMapView = (MapView) findViewById(R.id.bmapView);
pos_IV = (ImageView) findViewById(R.id.pos_IV);
Config.deviceWidthHeight = DensityUtil.getDeviceInfo(this);
System.out.println("widthpx=" + Config.deviceWidthHeight[0] + "**heightpx=" + Config.deviceWidthHeight[1]);
}


/*
* 设置APP
*/
private void setApp() {
app = (MyBaiduApp) this.getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(this);
app.mBMapManager.init(MyBaiduApp.strKey, new MyBaiduApp.MyGeneralListener());
}


}


/*
* 初始化地图 数据
*/
private void initMapView() {
mMapController = mMapView.getController();
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setAddrType("all");// 返回的定位结果包含地址信息
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 可以无偏差的显示在百度地图上
option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
option.disableCache(true);// 禁止启用缓存定位
option.setPoiNumber(5); // 最多返回POI个数
option.setPoiDistance(1000); // poi查询距离
option.setPriority(LocationClientOption.GpsFirst);// gps优先
option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息
mLocClient.setLocOption(option);
mLocClient.start();
mMapView.getController().setZoom(15);
mMapView.getController().enableClick(true);
mMapView.setBuiltInZoomControls(true);


GeoPoint centerpt = mMapView.getMapCenter();
int maxLevel = mMapView.getMaxZoomLevel();
int zoomlevel = mMapView.getZoomLevel();
boolean isTraffic = mMapView.isTraffic();
boolean isSatillite = mMapView.isSatellite();
boolean isDoubleClick = mMapView.isDoubleClickZooming();
mMapView.setLongClickable(true);


// 初始化
mMKSearch = new MKSearch();
mMKSearch.init(app.mBMapManager, new MyMKSearchListener());


}


/*
* 按钮点击事件 获取截图,异步方法
*/
public void capturemapclick(View view) {
mMapView.getCurrentMap();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_baidu, menu);
return true;
}


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


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


@Override
protected void onDestroy() {
mMapView.destroy();
MyBaiduApp app = (MyBaiduApp) this.getApplication();
if (app.mBMapManager != null) {
app.mBMapManager.destroy();
app.mBMapManager = null;
}
super.onDestroy();
}


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);


}


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}


public class NotifyLister extends BDNotifyListener {
public void onNotify(BDLocation mlocation, float distance) {
}
}
}

最后记得在清单文件中这儿修改一下哦



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
================================================================================================== 电子地图一把抓V1.0 Google Earth非完美版及无损压缩版 解决了电子地图一把抓原版的下列问题: ● 抓Google Earth卫图时导致地球旋转,无法正确抓图的问题 ● 抓非卫图地图时,在道路边界及文字附近出现噪点问题。去除噪点后,可以制作出更清晰、也更小的最终文件 GE非完美版的非完美性表现在: 抓Google Earth带KML/KMZ地标显示的卫图时,在某次自动移动地球时,若GE抓手下方恰好有图标,在目前最新的 GE V4.3beta版测试的结果看,抓手会“滑”一小段,导致错位。 但实测无图标显示的KML/KMZ或关闭其图标,显示道路及面状物时,未测出问题(未进行大量测试)。因此电子地 图一把抓GE非完美版可以制作GE卫图底图+不带图标的KML/KMZ的地图。有图标时,需仔细检查,有问题可稍微改 变一下起点位置或抓图区域大小重抓试验。 可执行文件说明: MapCap.exe 原版本 MapCap_LZW.exe 24位模拟式下将TIF文件从有损JPEG压缩改为无损LZW压缩,解决图像出现噪点的问题。 推荐用于抓取非卫图的地图。 MapCap_GE.exe 用于Google Earth,非完美(屏幕上图标较密集时有可能导致错位)。存储的结果TIF 文件24位模式下与原版一样,采用有损JPEG压缩。 MapCap_GE_LZW.exe 同MapCap_GE.exe,但24位模拟式下采用无损LZW压缩。 推荐用于抓取Google Earth卫图,特别是带KML显示时,但有图标显示时需仔细检查结果 是否有错位的现象。 注:电子地图一把抓的所有权利完全归原作者Kenchang所有。感谢Kenchang编写这么实用又有生命力的软件。 2009.1.2 ================================================================================================== kenchang对原版的说明: 1、软硬件要求 2、安装卸载说明 3、已知问题 4、版权声明 1、软硬件要求 可运行在Windows98/ME/2000/XP之上,CPU为奔腾133以上,内存32M以上。抓取大图时会需要大量内存, 建议内存为512M以上。 2、安装卸载说明 本软件为绿色软件,将所有文件复制到同一目录,运行mapcap.exe即可。删除时将该目录下的所有文件删除。 3、已知问题 本软件未经广泛测试,谬误在所难免 4、版权声明 本软件为免费软件,不提供任何形式的技术支持。本软件仅供学习交流用途, 不得用于任何形式的商业目的或其他非法目的,在抓图之前应先取得原版权所有者的同意, 使用本软件造成的任何后果均与本软件作者无关。 kenchang
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值