【Android应用开发】-(13)屏幕截图功能--截取全屏,无需Root(附源码)
来源:互联网 发布:如何在淘宝网上卖东西 编辑:程序博客网 时间:2024/05/16 06:08
由于要做说明书,或者给客户看效果图,不得不通过截图的方式把屏幕接下来(当然了,还可以通过拍照来达到目的)。于是就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(),请看代码吧。
package org.winplus.ss;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Matrix;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.Display;import android.view.Surface;import android.view.WindowManager;import android.os.SystemProperties;public class SimpleScreenshotActivity extends Activity {private Display mDisplay;private WindowManager mWindowManager;private DisplayMetrics mDisplayMetrics;private Bitmap mScreenBitmap;private Matrix mDisplayMatrix;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);new Thread(new Runnable() {@Overridepublic void run() {takeScreenshot();}}).start();}private float getDegreesForRotation(int value) {switch (value) {case Surface.ROTATION_90:return 360f - 90f;case Surface.ROTATION_180:return 360f - 180f;case Surface.ROTATION_270:return 360f - 270f;}return 0f;}private void takeScreenshot() {mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);mDisplay = mWindowManager.getDefaultDisplay();mDisplayMetrics = new DisplayMetrics();mDisplay.getRealMetrics(mDisplayMetrics);mDisplayMatrix = new Matrix();float[] dims = { mDisplayMetrics.widthPixels,mDisplayMetrics.heightPixels };int value = mDisplay.getRotation();String hwRotation = SystemProperties.get("ro.sf.hwrotation", "0");if (hwRotation.equals("270") || hwRotation.equals("90")) {value = (value + 3) % 4;}float degrees = getDegreesForRotation(value);boolean requiresRotation = (degrees > 0);if (requiresRotation) {// Get the dimensions of the device in its native orientationmDisplayMatrix.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) { // Rotate the screenshot to the current orientation Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(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; } // If we couldn't take the screenshot, notify the user if (mScreenBitmap == null) { return; } // Optimizations mScreenBitmap.setHasAlpha(false); mScreenBitmap.prepareToDraw(); try {saveBitmap(mScreenBitmap);} catch (IOException e) {System.out.println(e.getMessage());}}public void saveBitmap(Bitmap bitmap) throws IOException {String imageDate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date(System.currentTimeMillis()));File file = new File("/mnt/sdcard/Pictures/"+imageDate+".png");if(!file.exists()){file.createNewFile();}FileOutputStream out;try {out = new FileOutputStream(file);if (bitmap.compress(Bitmap.CompressFormat.PNG, 70, out)) {out.flush();out.close();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
PS:1、需要在AndroidManifest.xml中加入代码:android:sharedUserId="android.uid.system"
2、由于调用了@hide的API,所以编译得时候请使用makefile编译。或者通过在Eclipse中添加Jar文件通过编译。
3、此代码只在Android4.0中使用过,2.3的就没去做测试了。
原创文章转载请注明出处:http://www.blog.csdn.net/tangcheng_ok
- 【Android应用开发】-(13)屏幕截图功能--截取全屏,无需Root(附源码)
- 【Android应用开发】-(13)屏幕截图功能--截取全屏,无需Root(附源码)
- 【Android应用开发】-(13)屏幕截图功能--截取全屏,无需Root(附源码)
- 【Android应用开发】-屏幕截图功能--截取全屏,无需Root(附源码)
- 屏幕截图功能--截取全屏,无需Root(附源码)
- Android手机截图代码(针对root设备,可截取任意屏幕)
- C++实现屏幕截图(全屏截图)
- MFC截图功能(全屏)
- (转)无需安装SDK,3部完成Android客户端开发(附源码)
- 关于android全屏截图,无需root,无状态栏,2个方法
- Android开发之拍照功能实现(附源码)
- Android开发之拍照功能实现(附源码)
- Android屏幕截图功能
- Android应用开发揭秘高清版pdf分享(附源码)
- 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
- 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
- Android-屏幕截图功能实现
- 无线调试android程序(无需root)
- 特征检测和跟踪经典理论
- C++中的强制类型转换
- 线程详解
- Flashbot让批量预装应用更简单
- 关于servlet纠结的一个问题
- 【Android应用开发】-(13)屏幕截图功能--截取全屏,无需Root(附源码)
- android 点击后获取焦距使用
- 本人的“协同智慧观”建立在“人脑智力观”和“电脑智能观”及其广义双语协同处理的基础之上。
- C++ 11 右值引用的理解
- epoll两种触发方式
- C#新手练习:开发一个应用,模拟移动存储设备的读写
- Ipad版本中照相机的用法---只能用Pop视图
- Struts2+Spring 整合成功测试案例(二)
- 添加UART3