在 Android 12 上实施 STILL_IMAGE_CAPTURE_SECURE

Posted

技术标签:

【中文标题】在 Android 12 上实施 STILL_IMAGE_CAPTURE_SECURE【英文标题】:Implementing STILL_IMAGE_CAPTURE_SECURE on Android 12 【发布时间】:2021-12-19 05:53:16 【问题描述】:

我目前正在尝试为我的相机应用实现 STILL_IMAGE_CAPTURE_SECURE 意图。 (在安全模式下双击电源按钮时触发的意图)

我在清单文件中添加了 WAKE_LOCK 和 DISABLE_KEYGUARD 权限,并将该活动的 showOnLockScreen 和 showOnLockScreen 设置为 true。

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

<!-- [...] -->

<activity
            android:name=".ui.activities.SecureMainActivity"
            android:taskAffinity=".ui.activities.SecureMainActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
            android:screenOrientation="nosensor"
            android:showWhenLocked="true"
            android:showOnLockScreen="true"
            android:excludeFromRecents="true"
            android:exported="true">

            <intent-filter>
                <action android:name="android.media.action.STILL_IMAGE_CAMERA_SECURE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

        </activity>

我们已经在 Android 11 (AOSP) 上测试了我们的应用程序,双击以在锁定屏幕中打开相机工作正常/如预期那样(我们的应用程序与其他实现此意图的应用程序一起可见,例如 Intent 选择器中的 Google 相机) 但在 Android 12 (AOSP) 中,Google 相机会直接被触发(这隐含意味着我们的应用并未被考虑用于该意图)。

如果未安装 Google 相机,则不会真正触发任何内容。

什么可能导致这种意外行为?

【问题讨论】:

【参考方案1】:

根据'How double-click power launches the camera' guide:

请注意,从 Android 12 开始,根据某些 OEM 的要求,如果特殊字符串资源 config_cameraGesturePackage 不为空,则会将其视为要添加到不安全相机意图的包名称,从而将调用限制为单个应用程序,通常会阻止隐式意图解析。此包必须在设备上,否则相机手势将无法正常工作。

如commit that added this code中所述:

在拍照时使用隐含意图 通常会被忽视。但是在安装后立即 新相机,这种行为变得非常令人沮丧 用户看到一个令人费解的解析器对话框 (或者在安全相机的情况下,身份验证器)。 如果此时用户选择制作其中一个 选项默认,几乎不可能弄清楚如何 更改此设置。

因此,许多 OEM 只需将相机手势硬编码为 启动特定的预装相机,但这很糟糕 由 AOSP 支持,导致重复实施和 错误。此补丁在系统 UI 中路由所有相机意图 通过单个实用程序类,创建一个方便的位置 插入包含 OEM 的默认值的资源 预装相机应用。

它继续解释如何确定执行此操作时触发的意图:

要查找的 Bugreport/dumpsys 输出:

$ adb shell dumpsys activity service com.android.systemui | grep -C3 'Camera gesture' | tail -3
    Camera gesture intents:
      Insecure camera: Intent  act=android.media.action.STILL_IMAGE_CAMERA 
      Secure camera: Intent  act=android.media.action.STILL_IMAGE_CAMERA_SECURE flg=0x800000 
      Override package: null

通过查看“覆盖包”,您可以查看特定的相机包(例如与 Google 相机应用关联的相机包)是否被定义为唯一可以处理此意图的相机。如果是这种情况,那么预计您的应用将永远无法在该特定设备上处理该意图。

当然,如果您是 OEM 并控制自己设备上的资源覆盖,您可能需要更新 config_cameraGesturePackage 字符串资源以指向您的自定义相机应用程序,或者如果您想允许任何相机,请将其留空应用程序来处理此操作。

【讨论】:

这真的很有帮助@ianhanniballake。很长一段时间后,终于知道问题到底出在哪里了。非常感谢您的回答!

以上是关于在 Android 12 上实施 STILL_IMAGE_CAPTURE_SECURE的主要内容,如果未能解决你的问题,请参考以下文章

如何在本机移动应用程序(例如 IOS)上实施 3D 安全(Visa / MasterCard SecureCode 验证)

在服务上实施 INotifyCollectionChanged 或 INotifyPropertyChanged 可以吗?

在 Firebase 登录上实施 Smart Lock 密码

在 Exchange ActiveSync 客户端上实施配置

在亚马逊美食评论数据集上实施的朴素贝叶斯问题

yaffs2在am335x上实施