截图的几种方法
Android获取屏幕截图主要有以下三种方法
1、通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏。
这种方式Android 5.0之前也可以,且不需要权限。可以截取本应用内任意位置的屏幕截屏,可能会有些webview会截取不到。
注意这种方式只能获取当前应用内的截图(连顶部状态栏中的时间等都信息都获取不到,获取到的状态栏是一片空白)。
2、通过Linux底层驱动来实现截屏。
linux的图像信息都是通过FrameBuffer来写到显示设备上的,所以可以通过读取这个buffer的信息来获取屏幕截图。
DDMS工具就是通过这种方式来获取截图的。FrameBuffer对应的设备文件目录是/dev/graphics/fb0。
但是这种方法需要root权限,由于是直接从底层显示数据读取的,所以理论上是属于手机屏幕的任何信息都可以截取到。
3、通过Android 5.0后的MediaProjection API实现截屏。
该接口官方说是用来屏幕录制和音频录制,可以参照系统自带的sample案例ScreenCapture。
这种方法不用root,api是开放的,不过只针对L版以上。
Activity
public class MainActivity extends ListActivity {
private TextView tv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] array = { "获取指定Activity整个屏幕,带状态栏", "获取指定Activity整个屏幕,不带状态栏",//
"获取指定Activity指定View的区域屏幕", "获取指定Activity指定View的区域屏幕2", //
"获取指定Activity指定区域屏幕", "使用Android 5.0后的MediaProjection API" };
for (int i = 0; i < array.length; i++) {
array[i] = i + "、" + array[i];
}
tv = new TextView(this);// 将内容显示在TextView中
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(params);
tv.setTextColor(Color.BLUE);
tv.setText("我是一个TextView");
getListView().addFooterView(tv);
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Bitmap bitmap = null;
switch (position) {
case 0:
bitmap = SnapUtils.snapShot(this, true);
SnapUtils.saveBitmap2Pic(bitmap, "bqt0.jpg");
break;
case 1:
bitmap = SnapUtils.snapShot(this, false);
SnapUtils.saveBitmap2Pic(bitmap, "bqt1.jpg");
break;
case 2:
bitmap = SnapUtils.snapShot(this, v);
SnapUtils.saveBitmap2Pic(bitmap, "bqt2.jpg");
break;
case 3:
bitmap = SnapUtils.snapShot(this, tv);
SnapUtils.saveBitmap2Pic(bitmap, "bqt3.jpg");
break;
case 4:
bitmap = SnapUtils.snapShot(this, 300, 300, 100, 200);
SnapUtils.saveBitmap2Pic(bitmap, "bqt4.jpg");
break;
case 5:
startActivity(new Intent(this, Activity2.class));
break;
}
if (bitmap != null) Toast.makeText(this, bitmap.getWidth() + "--" + bitmap.getHeight(), Toast.LENGTH_SHORT).show();
}
}
工具类
public class SnapUtils {
//******************************************************************************************
// 屏幕截图
//******************************************************************************************
/**获取指定Activity整个屏幕截图,这种方式只能获取当前应用的截图(连顶部状态栏中的时间等都获取不到)
* @param withStatusBar 是否包含状态栏
*/
public static Bitmap snapShot(Activity activity, boolean withStatusBar) {
int statusBarHeight = 0;
if (!withStatusBar) {
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
statusBarHeight = frame.top;
}
DisplayMetrics metric = new DisplayMetrics();
((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
return snapShot(activity, 0, statusBarHeight, metric.widthPixels, metric.heightPixels - statusBarHeight);
}
/**
* 获取指定Activity指定View的屏幕截图,这种方式只能获取当前应用的截图(连顶部状态栏中的时间等都获取不到)
* @param activity
* @param view
* @return
*/
public static Bitmap snapShot(Activity activity, View view) {
return snapShot(activity, (int) view.getX(), (int) view.getY(), (int) view.getWidth(), (int) view.getHeight());
}
/**
* 获取指定Activity指定区域的屏幕截图,这种方式只能获取当前应用的截图(连顶部状态栏中的时间等都获取不到)
* @param activity 所要截取的Activity
* @param x The x coordinate of the first pixel in source
* @param y The y coordinate of the first pixel in source
* @param width The number of pixels in each row
* @param height The number of rows
* @return A copy of a subset of the source bitmap or the source bitmap itself.
*/
public static Bitmap snapShot(Activity activity, int x, int y, int width, int height) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap cache = view.getDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(cache, x, y, width, height);
view.destroyDrawingCache();
return bitmap;
}
/**
* 保存bitmap为图片
* @param bitmap
* @param fileName 文件名,注意是保存在了SD卡根目录下
*/
public static void saveBitmap2Pic(Bitmap bitmap, String fileName) {
try {
File file = new File(Environment.getExternalStorageDirectory().getPath(), fileName);
file.createNewFile();//在window中没问题,但是在Android上必须加这一句,否然报异常 java.io.FileNotFoundException: xxx: open failed: EROFS (Read-only file system)
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Android 5.0之后屏幕截图的方法
截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...
- Xamarin.Android 6.0以后开启权限方法
Android 6.0 版本以上一些危险权限只能在运行的时候依次询问用户是否赋予,所以在开发的时候使用 RequestPermissions 方法单独请求所需要的权限. 代码: //开启相机权限 if ...
- Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)
http://www.xuebuyuan.com/558284.html 方法一 public class MainActivity extends Activity { @Override prot ...
- Android 6.0 SDK 找不到HttpClient的解决方法
一.情况描述 在eclipse或Android Studio开发时(笔者目前只用过Android Studio),设置Android SDK的编译版本为23时,且使用了httpClient相关类的库项 ...
- android 6.0 SDK中删除HttpClient的相关类的解决方法
一.出现的情况 在eclipse或 android studio开发, 设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http ...
- Android 4.0 ProGuard 代码混淆 以及 proguard returned with error code 1.See console异常的解决方法
最近呢说要上线,就去找了下上线的方法...之前做过代码混淆,用的是progarud.cfg,但是呢自己反编译了之后还是无效,然后就丢着先不管了,因为实在不知道什么情况.今天来上线的时候结果总是报错,总 ...
- android 获取栈顶activty的方法总结(兼容API 5.0)
声明:本文为Dujinyang CSDN原创投稿文章,未经许可,禁止任何形式的转载. 最近5.0\6.0\7.0 安卓系统都陆续上岗了,兼容性和代码更新是个很头疼的问题,这次我们来说下TASK的基础和 ...
- Android 8.0 的部分坑及对应解决方法
虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了. 但是迟到好过不到,因此基于此这边还是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法. 每次系统升级,虽然系统功能更 ...
- Gradle 同步时报错,Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha8的解决方法
Error:Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha8. 原因: SDK 中可能是没有安装 ...
随机推荐
- OpenGL—Android 开机动画源码分析一
.1 Android开机动画实现方式目前实现Android开机动画的方式主要是逐帧动画和OpenGL动画. ?逐帧动画 逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的 ...
- runtime关联属性示例
前言 在开发中经常需要给已有的类添加方法和属性,但是Objective-C是不允许给已有类通过分类添加属性的,因为类分类是不会自动生成成员变量的.但是,我们可以通过运行时机制就可以做到了. 本篇文章适 ...
- 4位开锁<dfs>
题意: 有一个四位密码的锁,每一位是1~9的密码,1跟9相连.并且相邻的连个密码位可以交换.每改变一位耗时1s,给出锁的当前状态和密码,求最少解锁时间. 思路: 用bfs枚举出所有相邻交换的情况,并记 ...
- servlet中路径的获取
1.获取项目的绝对路径 可以request.getRealPath("/"),但是这个方法已经废弃了,最好用this.getServletContext().getRealPath ...
- mysql 初始化时root无密码
修改密码 update user set password=PASSWORD('123456') where User='root'; 添加用户设置权限 grant select,insert,upd ...
- Loadrunner性能测试分类详(二)
一.基准测试 有基础的标准,这样能通过对比发现系统的不同点与变化. 1.可以再指定的标准下通过基准测试建立一个性能基准,这样以后当系统的环境.参数发生变化后,再进行一次相同标准下的测试,即可看出变化对 ...
- property函数
__metaclass__=type class Rectangle: def __init__(self): self.width=0 sel ...
- 简易控制中心,angular的简单使用
<html> <head> <meta charset='utf-8'> <script src="js/angular.js">& ...
- UVALive 2035 The Monocycle(BFS状态处理+优先队列)
这道题目真是非常坎坷啊,WA了很多次,但所有的思路都是奔着广搜去想的,一开始出现了比答案大的数据,才想到了应该是优先队列,再说加上也肯定不会错.一开始我读错了题意,以为旋转并且前行需要的时间跟其他一样 ...
- linux服务器安装php GD扩展库方法
Strict Standards: Only variables should be assigned by reference in/home/wienholl/public_html/includ ...