在 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 密码