Android 中,内置应用如何更好的截屏

在开发系统应用的时候,有时候需要用到截屏,因为 View.getDrawingCache() 截不到状态栏,所以这个方案不理想
这有一个更好的方案,就是用 SurfaceControl.screenshot() / Surface.screenshot() 截屏,在 API Level 大于 17 使用 SurfaceControl ,小于等于 17 使用 Surface ,但是这个方案有诸多限制,比如
1、需要反射调用,低版本中,Surface.screenshot() 函数是 hide 的,高版本中,SurfaceControl 类是 hide 的
2、调用 screenshot() 函数需要权限

3、上面需要的权限,只对应用签名与 platform 签名一致的应用起作用
所以,非系统应用是不能用的,即使调用了也会返回 null ,这个是一个对于系统应用非常合适的截图方案,具体代码如下

public Bitmap screenshot() {    DisplayMetrics metrics = new DisplayMetrics();    getWindowManager().getDefaultDisplay().getMetrics(metrics);    // 这里只是把两个类的写法写在一起    // 在系统中,系统版本是确定的,所以选其中一个    if (Build.VERSION.SDK_INT <= 17) {        return Surface.screenshot(metrics.widthPixels, metrics.heightPixels);    } else {        return SurfaceControl.screenshot(metrics.widthPixels, metrics.heightPixels);    }}

当然还需要在 AndroidManifest.xml 中加入上面说的权限,否则截屏会失败的
注意,我这里为什么没有用反射,因为,标题里说了,是 Android 内置应用,就是跟随系统一起编译的,所以是可以直接调用隐藏 api 的,用这个方案截的图是包含状态栏的

更多相关文章

  1. android自动化测试CTS源码分析之一
  2. Android(安卓)8.0指纹流程
  3. Android基础知识梳理
  4. Android(安卓)Service 两种启动方式的区别
  5. Fragment报错记录
  6. android 自定义接听电话时报错:java.lang.SecurityException: Nei
  7. Android(安卓)中Service组件
  8. Android培训班(83)Dalvik虚拟机的初始化
  9. [无线] Android(安卓)系统开发学习杂记

随机推荐

  1. 【DB笔试面试219】在Oracle中,如果发现有
  2. Greenplum6 数据库数据库学习_外部表
  3. 【DB笔试面试536】在Oracle中,Oracle 10g
  4. 【DB笔试面试842】在Oracle中,如何启动Ora
  5. 【DB笔试面试444】Oracle中PL/SQL的流程
  6. 【DB笔试面试223】在Oracle中,如果丢失一
  7. 记录一次宕机后,OGG出现故障,OGG-01705的解
  8. 靶机***之Typhoon实战
  9. Facebook是如何通过Android应用程序跟踪
  10. [原创干货]Oracle Sharding实施教程来袭!!!