Android(安卓)rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)
16lz
2021-01-25
网上很多资料都是说使用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变换操作
更多相关文章
- GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
- android 加载外部矢量图SVG
- [置顶] Retrofit2使用方式和源码解析
- Java HTTP 网络请求库框架的使用
- android ndk build
- android wap连接网络设置代理
- android sdk manager 无法更新
- Android获取Contact Number的例子(2.0系统以前的获取方式)
- Android(安卓)finish()自动回调时机,Activity资源释放逻辑放在onD