ADB 无法在 Android 11 上启动 IMAGE_CAPTURE 意图 activity

ADB unable to start IMAGE_CAPTURE intent activity on Android 11

以下 ADB 命令不适用于 Android 11 个设备

adb -d shell "am start -a android.media.action.IMAGE_CAPTURE" -W

结果

Starting: Intent { act=android.media.action.IMAGE_CAPTURE }
Error: Activity not started, unknown error code 102

好像跟Android11的变化有关,看这里说的解决方法是在manifest里加上这个

<queries>
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
</queries>

ADB 中是否有与此等效的内容?

这似乎是 Android 中的错误。相机 activity 启动不会因为您链接到的问题而失败,而是因为 AppOpsManager 服务拒绝:

05-04 14:16:51.789   620  2669 W ActivityTaskManager: Appop Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x10000000 cmp=com.android.camera2/com.android.camera.CaptureActivity } from null (pid=4079, uid=2000) requires android:camera

这可以通过

验证
adb shell appops get com.android.shell

其中 com.android.shell 是由命令行实用程序提供的包名称,例如 am 即 Android Shell 包。这产生

Uid mode: COARSE_LOCATION: foreground
LEGACY_STORAGE: ignore
CAMERA: allow; rejectTime=+4m37s345ms ago

显示 Shell 包导致 CAMERA 操作被拒绝的时间。

但是这种拒绝策略是不正确的,因为 com.android.shell 已经拥有可以通过

验证的 CAMERA 权限
adb shell dumpsys package com.android.shell|grep 'android.permission.CAMERA'
  android.permission.CAMERA
    android.permission.CAMERA: granted=true, flags=[ SYSTEM_FIXED|GRANTED_BY_DEFAULT]

一种替代方法(可能不适用于所有人)是从有效的根 shell(在 adb root/su 之后)开始此意图。

05-04 14:17:23.610   502  2518 I CameraService: CameraService::connect call (PID -1 "com.android.camera2", camera ID 0) for HAL version default and Camera API version 2