如何使用豆包手机的READ_FRAME_BUFFER权限截图密码画面

背景:

针对READ_FRAME_BUFFER的权限原理剖析前面文章已经进行了详细讲解,具体文章如下:

但是文章也给大家留下了一个疑问,那就是具有READ_FRAME_BUFFER权限到底是否可以截图到手机上secure画面,比如银行等密码手势画面。

针对这个疑问也进行了直播讲解和验证,答案就是READ_FRAME_BUFFER权限确实可以实现对这些敏感隐私画面进行截图。

下面给大家展示相关的源码,大家也可以自行用下面源码进行验证你的设备是否可以截图成果。

直播代码分享:

要进行截图secure layer的接口分享:

frameworks/base/core/java/android/window/ScreenCapture.java

cpp 复制代码
            /**
             * Whether to allow the screenshot of secure layers. Warning: This should only be done
             * if the content will be placed in a secure SurfaceControl.
             *
             * @see ScreenshotHardwareBuffer#containsSecureLayers()
             */
            public T setCaptureSecureLayers(boolean captureSecureLayers) {
                mCaptureSecureLayers = captureSecureLayers;
                return getThis();
            }

注释可以看出是可以截图安全的layer到sc。
不使用setCaptureSecureLayers截图代码如下:

cpp 复制代码
     public static  Bitmap captureScreenshot() {
        try {
            final ScreenCapture.CaptureArgs captureArgs = new ScreenCapture.CaptureArgs.Builder<>()
                    .setSourceCrop(new Rect(0,0,2960,1440))
                    .build();
            ScreenCapture.SynchronousScreenCaptureListener syncScreenCapture =
                    ScreenCapture.createSyncCaptureListener();
            try {
                WindowManagerGlobal.getWindowManagerService().captureDisplay(0,
                        captureArgs, syncScreenCapture);
            } catch (RemoteException e) {
                e.rethrowAsRuntimeException();
            }
            final ScreenCapture.ScreenshotHardwareBuffer screenshotHardwareBuffer =
                    syncScreenCapture.getBuffer();
            return  screenshotHardwareBuffer.asBitmap();

        } finally {

        }

    }
   

保存图片到sdcard私有目录方法:

cpp 复制代码
public static String saveBitmap(Context context, Bitmap bitmap,
                                    String subDir, String fileName) {
        File baseDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        if (baseDir == null) return null;

        File targetDir = new File(baseDir, subDir);
        if (!targetDir.exists()) targetDir.mkdirs();

        File imageFile = new File(targetDir, fileName + ".jpg");
        try (FileOutputStream fos = new FileOutputStream(imageFile)) {
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
            fos.flush();
            return imageFile.getAbsolutePath();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

调用方式:

cpp 复制代码
                CaptureScreenshotUtil.saveBitmap(MainActivity.this, CaptureScreenshotUtil.captureScreenshot(),"aaa","test");

权限声明:

bash 复制代码
    <uses-permission android:name="android.permission.READ_FRAME_BUFFER"></uses-permission>

注意需要基于源码编译apk,系统签名安装。

验证得到的结果

原设备画面展示:

截图到图片展示如下

明显看到手势密码部分的Activity是无法被截图到的,这块与豆包官方声明基本上一致。
但是真的是这样吗?

使用setCaptureSecureLayers后截图情况

代码上只是在原来基础上加入setCaptureSecureLayers(true)

cpp 复制代码
 try {
            final ScreenCapture.CaptureArgs captureArgs = new ScreenCapture.CaptureArgs.Builder<>()
                    .setSourceCrop(new Rect(0,0,2960,1440))
                    //重点差异
                    .setCaptureSecureLayers(true)
                    .build();
            ScreenCapture.SynchronousScreenCaptureListener syncScreenCapture =
                    ScreenCapture.createSyncCaptureListener();
            try {
                WindowManagerGlobal.getWindowManagerService().captureDisplay(0,
                        captureArgs, syncScreenCapture);
            } catch (RemoteException e) {
                Log.e("lsm666888", "Failed to request screencapture for display");
                e.rethrowAsRuntimeException();
            }
            final ScreenCapture.ScreenshotHardwareBuffer screenshotHardwareBuffer =
                    syncScreenCapture.getBuffer();
            return  screenshotHardwareBuffer.asBitmap();

        } finally {

        }

运行后进行截图,效果如下:

可以看出明显这次截图是可以截图到手势密码的画面了,所以最后的结论就是如下:

READ_FRAME_BUFFER权限确实是需要系统签名才可以使用的,默认不设置setCaptureSecureLayers(true)那确实无法截图到手势密码等secure画面,但是如果设置了setCaptureSecureLayers(true)就可以截图到各个secure的内容。

所以READ_FRAME_BUFFER权限是可以截图到各个手势密码等高度隐私的画面。

相关推荐
游戏开发爱好者81 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥1 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓2 小时前
[JDBC]元数据
android
独行soc2 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能2 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿2 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc2 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106323 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview