网上很多资料都是说使用View的getDrawingCache接口,这种方式有一个问题,无法截取到状态栏,因此个人不推荐。

View view = getWindow().getDecorView().getRootView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
temBitmap = view.getDrawingCache();

经过一番整理+验证,个人认为目前最完整的截屏方案如下:
1.使用screencap命令截屏整个屏幕
2.延时400ms后导出为原始的bitmapOrigin(400ms为多次调试得出的时间)
3.接收截屏广播,根据实际需求对bitmapOrigin进行放大+裁剪,得到需要的bitmapFinal
4.bitmapFinal输出为png文件,并删除原始截图文件

具体使用方式:
截屏逻辑写在service中,接收截屏广播,onReceive中执行截屏动作

以下是service里面的主要逻辑:

final boolean fullscreen = intent.getBooleanExtra("fullscreen", false);
final float scale = intent.getFloatExtra("scale", 0);
final int x = intent.getIntExtra("x", 0);
final int y = intent.getIntExtra("y", 0);
final int w = intent.getIntExtra("w", 0);
final int h = intent.getIntExtra("h", 0);
final String filepath = intent.getStringExtra("filepath");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US);
final String fname = "/sdcard/" + sdf.format(new Date()) + ".png";
try {Runtime.getRuntime().exec("screencap -p " + fname);
} catch (Exception e) {e.printStackTrace();
}new Handler().postDelayed(new Runnable() {@Overridepublic void run() {Bitmap bitmapOrigin = null;Bitmap bitmapFinal = null;try {bitmapOrigin = BitmapFactory.decodeFile(fname);} catch (Exception e) {e.printStackTrace();}if (bitmapOrigin != null) {if (fullscreen) {Matrix matrix = new Matrix();matrix.postScale(scale >= 1.0f ? scale : 1.0f, scale >= 1.0f ? scale : 1.0f);bitmapFinal = Bitmap.createBitmap(bitmapOrigin, 0, 0, bitmapOrigin.getWidth(), bitmapOrigin.getHeight(), matrix, true);} else {if (x >= 0 && w > 0 && y >= 0 && h > 0 &&x < bitmapOrigin.getWidth() && w < bitmapOrigin.getWidth() && y < bitmapOrigin.getHeight() && h < bitmapOrigin.getHeight()) {Matrix matrix = new Matrix();matrix.postScale(scale >= 1.0f ? scale : 1.0f, scale >= 1.0f ? scale : 1.0f);bitmapFinal = Bitmap.createBitmap(bitmapOrigin, x, y, w, h, matrix, true);}}if (bitmapFinal != null) {try {FileOutputStream fileOutputStream = new FileOutputStream(filepath);bitmapFinal.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);fileOutputStream.close();(new File(fname)).delete();bitmapOrigin.recycle();bitmapFinal.recycle();} catch (Exception e) {e.printStackTrace();Log.e(TAG, "save png error " + e.getMessage());}}}}
}, 400);
//延时400ms,确保截图成功之后再进行bitmap变换操作

Android rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)相关推荐

  1. android截全屏方法,Android rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)

    网上很多资料都是说使用View的getDrawingCache接口,这种方式有一个问题,无法截取到状态栏,因此个人不推荐. View view = getWindow().getDecorView() ...

  2. Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装

    Android ROM开发(一)--Windows下Cygwin和Android_Kitchen厨房的安装 很久没有碰到ROM开发了,在很久很久以前也是从ROM起步的,无奈还是一脚踏上了Android ...

  3. Android ROM开发(三)——精简官方ROM并且内置ROOT权限,开启Romer之路

    Android ROM开发(三)--精简官方ROM并且内置ROOT权限,开启Romer之路 相信ROM的相关信息大家通过前几篇的学习都是有所了解了,这里就不在一一提示了,这里我们下载一个官方包,我们还 ...

  4. Android应用开发(7)---Unicode和国际化支持

    Unicode和国际化支持 Android利用 ICU库和 CLDR项目来提供Unicode和其他国际化支持.本文档关于Unicode和国际化支持的讨论分为两部分:Android 6.0(API级别2 ...

  5. android 异形图片布局,杜蕾斯一张图说明异形全面屏手机进化史!刘海屏到水滴屏很形象...

    原标题:杜蕾斯一张图说明异形全面屏手机进化史!刘海屏到水滴屏很形象 全面屏手机最大的优势就是屏占比高,很多手机厂商都把提高屏占作为目标,于是现在就有了各种各样的异形屏.异形屏设计是一种妥协的产物,主要 ...

  6. 基于饿了么骨架屏方案,使用Chrome扩展程序生成网页骨架屏

    前言 ❝ 之前写移动端项目的时候,使用骨架屏来解决首屏渲染时出现短暂空白现象,采用了就是饿了么page-skeleton-webpack-plugin方法 ❞ 但是page-skeleton-webp ...

  7. ensp启动设备蓝屏_超全超详细的电脑蓝屏问题解决方案汇总

    生活太难了!每天搬砖已经够不容易,电脑还作妖: 设计图还差最后一个图层,蓝屏了!!财务工资表格马上统计完,蓝屏了?!熬了一宿马上写完1万字稿件,蓝屏了- 今天,我就带大家轻松搞定蓝屏. 什么是蓝屏 蓝 ...

  8. android+rom+bootloader+flash,Android ROM开发(4) bootloader 三种启动模式

    Andrew Huang 转载请注明作者及网址 HTC手机中用的bootloader称为HBoot,不知道是不是HTC Bootloader 之意,从官网的源码看这个bootloader不象是u-bo ...

  9. 怎么测试android rom,Android ROM开发(6) RUU刷机测试1

    Andrew Huang 转载请注明作者及网址 在刷机时,经常会听到几个名,OTA,RUU. RUU 是Rom Update Utility 的缩写,RUU是官方发布的的完整的升级包.HTC发包通常的 ...

最新文章

  1. 在Python中用Selenium执行JavaScript
  2. gzcms技术开发文档
  3. 自动化测试之鼠标悬浮操作、双击、鼠标拖拽
  4. 学习Spring(六) -- Spring中Bean的作用域以及生命周期
  5. 如何搭建Electron开发环境
  6. 采用合适的网站优化技术
  7. [Classic] 日文版《出师表》
  8. mysql数据库中数据类型的长度
  9. python函数对变量的作用_Python 包、模块、函数、变量作用域
  10. IntelliJ IDEA 2019.1.1 预览版发布,以及对旧版本的更新
  11. P2898 [USACO08JAN]haybale猜测Haybale Guessing
  12. top命令详解(转载)
  13. 笔记本电脑更换固态硬盘教程(联想ThinkPadE455)
  14. 在堆区开辟内存(动态内存的开辟)
  15. 微信推出热搜排行榜,微博压力山大?
  16. [jzoj 4249] 【五校联考7day1】游戏 {贪心/斜率优化}
  17. 查看主机oracle 版本,CentOS下查看Oracle数据库版本
  18. 风再起时?风继续吹........
  19. linux赛门铁克扫描,赛门铁克数据扫描程序(Symantec Data Scanner, SDS)技术简介
  20. TWAIN扫描识别工具v16.2正式发布,添加了新的API

热门文章

  1. cesium模型不遮挡点线面_cesium 学习(八) 基础绘制(点线面)
  2. 漂亮妹妹~~~~~~`
  3. 共享yum资源库下一键安装虚拟机的脚本3【完全自动化】
  4. Mysql 5.7 表名大写遇到的坑 error: 1146: Table 'your_table' doesn't exist
  5. HC-SR04模块初始化
  6. python人工智能入门零基础_【贾老坏】真·零基础入门人工智能+Python+数学
  7. 开始使用Elasticsearch (2): 了解如何进行搜索
  8. ACM模板 | 学习笔记 树相关
  9. 【破解利器】反汇编工具 and 反编译(Decompilers)
  10. Python Socket网络编程(一)初识Socket和Socket初步使用