美文网首页项目Android知识Android开发
Android 内置应用截屏方法

Android 内置应用截屏方法

作者: 为何是Hex的昵称 | 来源:发表于2017-03-14 15:31 被阅读325次

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

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

    <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
    

    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 的,用这个方案截的图是包含状态栏的

    相关文章

      网友评论

        本文标题:Android 内置应用截屏方法

        本文链接:https://www.haomeiwen.com/subject/fchhnttx.html