网上很多资料都是说使用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变换操作

更多相关文章

  1. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  2. android 加载外部矢量图SVG
  3. [置顶] Retrofit2使用方式和源码解析
  4. Java HTTP 网络请求库框架的使用
  5. android ndk build
  6. android wap连接网络设置代理
  7. android sdk manager 无法更新
  8. Android获取Contact Number的例子(2.0系统以前的获取方式)
  9. Android(安卓)finish()自动回调时机,Activity资源释放逻辑放在onD

随机推荐

  1. Android回调事件传播-android学习之旅(四
  2. TextView设置行间距 和 字间距
  3. android之创建快捷方式
  4. android 处理http例子
  5. Android(安卓)FrameWork——StatusBar
  6. Android依赖管理与私服搭建
  7. android之activity中onSaveInstanceState
  8. android 图片全屏
  9. android控制home键 代码
  10. Android安装软件提示:“INSTALL_FAILED_DE