转载出处: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){
-
-
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){
-
-
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;
-
}
-
-
-
if(mScreenBitmap==null){
-
return;
-
}
-
-
-
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的就没去做测试了。
分享到:
相关推荐
pb截取屏幕的功能,类微信截屏功能 适合PB开发人员。 导入sru文件 pb截取屏幕的功能,类微信截屏功能 pb截取屏幕的功能,类微信截屏功能 pb截取屏幕的功能,类微信截屏功能 pb截取屏幕的功能,类微信截屏功能 pb截取...
Android应用源码截屏和截取网页整页内容
截屏和截图的区别就是截屏只会截取当前屏幕内容,截图会截取一些未显示的内容,例如使用浏览器访问一个网站,屏幕只能显示网站的一部分,但是使用截图功能就可以把整个网页包括未显示的部分都截取下来。
c#截取屏幕源码c#截取屏幕源码c#截取屏幕源码c#截取屏幕源码
|--android root下禁用组件 |--android 判断网络状态 |--android 对话框样式 |--android 开机启动 |--android 挪动dialog的位置 |--android 控制对话框位置 |--android 根据uri获取路径 |--android 模拟器错误 |--...
网上找了很多屏幕截图的东西,这里指定截取屏幕一个LinerLayout中的内容。自动截图保存到本地。
Android截屏源码,可以截取全屏和局部webview中内容,以及保存到SD卡中和从SD卡中读取所截取图片
Android进行截图,通过把view装换成bitmap的方式,可以截取屏幕外的部分
android-imagecroper 实现了截取图片的功能,常用于截取头像 使用方法 Gradle > compile 'li.xiangyang.android:imagecroper:0.5.3@aar'
前两年IOS应用源码-主要是用于毕业设计学习的。
自己照着做的截图软件,有截取全屏,截取区域功能。
Android获取webView快照与屏幕截屏的方法
* 本项目借鉴 一种全新的截屏方法并自己修改去掉悬浮按钮做成后台实时运行截图方式 * 保存路径: getSDCardPath() + "/text7/ScreenImage"; * 可以实现后台实时截屏的功能 * 欢迎大家学习。 * 一种全新的...
Android中截取屏幕截图功能代码,在android APP程序中,可以用以上代码截图。
C# vs2010开发 包含电脑屏幕截取安装包、电脑屏幕截取项目源码、电脑屏幕截取打包项目,功能介绍:可设置定时截取屏幕指定区域或全屏截取
NULL 博文链接:https://daimojingdeyu.iteye.com/blog/337141
Android实现截取当前屏幕图片并保存到SDCard卡中。
本项目是一个简单的网站新闻客户端,新闻数据直接调用合肥工业大学官网(http://news.hfut.edu.cn/),实现了新闻获取的功能,界面较简单,新闻内容不是解析html的而是用webview截取html的部分内容来显示的,据作者...
仿Android版qq的自定义头像截取功能,可以随意截取图片的某部分作为头像.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。