转载出处:http://www.blog.csdn.net/tangcheng_ok
由于要做说明书,或者给客户看效果图,不得不通过截图的方式把屏幕接下来(当然了,还可以通过拍照来达到目的)。于是就Google找到一些需要Root权限,和不需要Root权限的截图应用,有些失望,多数不可用。于是就想自己开发一个截图的应用。在View 中提供一个getDrawingCache的方法,可以通过次方法获取View的截屏,但仅仅是截取View的。如果要截取状态栏呢?
其实不然,在ICS中的SystemUI就实现了截图的功能,按组合键Power+Volume Add/Volume sub就能截取图片。代码目录:
frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/在此目录下就两个文件,主要的截图方法在GlobalScreenshot中,本文就通过移植SystemUI中截图的代码实现截图功能。
首先是直接移植SystemUI的代码,实现截图效果,这部分的代码就不贴出来了,直接去下载代码吧, 关键的代码没有几句,最最主要的是:Surface.screenshot(),请看代码吧。
- <spanstyle="font-size:16px;">packageorg.winplus.ss;
- importjava.io.File;
- importjava.io.FileNotFoundException;
- importjava.io.FileOutputStream;
- importjava.io.IOException;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Canvas;
- importandroid.graphics.Matrix;
- importandroid.os.Bundle;
- importandroid.util.DisplayMetrics;
- importandroid.util.Log;
- importandroid.view.Display;
- importandroid.view.Surface;
- importandroid.view.WindowManager;
- importandroid.os.SystemProperties;
- publicclassSimpleScreenshotActivityextendsActivity{
- privateDisplaymDisplay;
- privateWindowManagermWindowManager;
- privateDisplayMetricsmDisplayMetrics;
- privateBitmapmScreenBitmap;
- privateMatrixmDisplayMatrix;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- newThread(newRunnable(){
- @Override
- publicvoidrun(){
- takeScreenshot();
- }
- }).start();
- }
- privatefloatgetDegreesForRotation(intvalue){
- switch(value){
- caseSurface.ROTATION_90:
- return360f-90f;
- caseSurface.ROTATION_180:
- return360f-180f;
- caseSurface.ROTATION_270:
- return360f-270f;
- }
- return0f;
- }
- privatevoidtakeScreenshot(){
- mWindowManager=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
- mDisplay=mWindowManager.getDefaultDisplay();
- mDisplayMetrics=newDisplayMetrics();
- mDisplay.getRealMetrics(mDisplayMetrics);
- mDisplayMatrix=newMatrix();
- float[]dims={mDisplayMetrics.widthPixels,
- mDisplayMetrics.heightPixels};
- intvalue=mDisplay.getRotation();
- StringhwRotation=SystemProperties.get("ro.sf.hwrotation","0");
- if(hwRotation.equals("270")||hwRotation.equals("90")){
- value=(value+3)%4;
- }
- floatdegrees=getDegreesForRotation(value);
- booleanrequiresRotation=(degrees>0);
- if(requiresRotation){
- //Getthedimensionsofthedeviceinitsnativeorientation
- mDisplayMatrix.reset();
- mDisplayMatrix.preRotate(-degrees);
- mDisplayMatrix.mapPoints(dims);
- dims[0]=Math.abs(dims[0]);
- dims[1]=Math.abs(dims[1]);
- }
- mScreenBitmap=Surface.screenshot((int)dims[0],(int)dims[1]);
- if(requiresRotation){
- //Rotatethescreenshottothecurrentorientation
- Bitmapss=Bitmap.createBitmap(mDisplayMetrics.widthPixels,
- mDisplayMetrics.heightPixels,Bitmap.Config.ARGB_8888);
- Canvasc=newCanvas(ss);
- c.translate(ss.getWidth()/2,ss.getHeight()/2);
- c.rotate(degrees);
- c.translate(-dims[0]/2,-dims[1]/2);
- c.drawBitmap(mScreenBitmap,0,0,null);
- c.setBitmap(null);
- mScreenBitmap=ss;
- }
- //Ifwecouldn'ttakethescreenshot,notifytheuser
- if(mScreenBitmap==null){
- return;
- }
- //Optimizations
- mScreenBitmap.setHasAlpha(false);
- mScreenBitmap.prepareToDraw();
- try{
- saveBitmap(mScreenBitmap);
- }catch(IOExceptione){
- System.out.println(e.getMessage());
- }
- }
- publicvoidsaveBitmap(Bitmapbitmap)throwsIOException{
- StringimageDate=newSimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
- .format(newDate(System.currentTimeMillis()));
- Filefile=newFile("/mnt/sdcard/Pictures/"+imageDate+".png");
- if(!file.exists()){
- file.createNewFile();
- }
- FileOutputStreamout;
- try{
- out=newFileOutputStream(file);
- if(bitmap.compress(Bitmap.CompressFormat.PNG,70,out)){
- out.flush();
- out.close();
- }
- }catch(FileNotFoundExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- </span>
PS:1、需要在AndroidManifest.xml中加入代码:android:sharedUserId="android.uid.system"
2、由于调用了@hide的API,所以编译得时候请使用makefile编译。或者通过在Eclipse中添加Jar文件通过编译。
3、此代码只在Android4.0中使用过,2.3的就没去做测试了。