当前位置: 首页 > 知识库问答 >
问题:

Android 11(R)查询意图时返回空列表ACTION_IMAGE_CAPTURE

宋伯寅
2023-03-14

设备:Emulator pixel 3a-Android11

代码:

    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final List<ResolveInfo> listCam = 
    context.getPackageManager().queryIntentActivities(captureIntent, 0);

使用时:

targetSdkVersion 30
compileSdkVersion 30

listCam大小为0

当切换到:

compileSdkVersion 29

listCam大小是1-因为它应该是。

使用以下代码:

    val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    baseActivity.startActivity(captureIntent)

工作正常,并显示相机应用程序

你知道为什么queryIntentActivities没有返回摄像机的意图吗?

谢谢!

共有3个答案

佴阳曦
2023-03-14

我的Android 11解决方案,用于获取ResolveInfo列表。

  • 当我们只通过MediaStore扫描时。行动_图像_捕获过滤器然后我们只会得到一个!应用程序记录-系统默认摄像头应用程序

完整的解决方案如下:

/**
 * Return all camera possible apps
 * @param context
 * @return
 */
public static List<ResolveInfo> getCameraAppsResolveInfo(Context context){
    List<ResolveInfo> resolveInfo = new ArrayList<>();
    if (Utils.isNull(context)){
        return resolveInfo;
    }
    final Intent capturePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    PackageManager pm = context.getPackageManager();
    resolveInfo = pm.queryIntentActivities(capturePhoto, 0);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
        // For Android 11 we need to add specific camera apps
        // due them are not added during ACTION_IMAGE_CAPTURE scanning...
        resolveInfo.addAll(getCameraSpecificAppsInfo(context));
    }
    return resolveInfo;
}

/**
 * For Android 11
 * Return camera possible apps
 */
static final String[] CAMERA_SPECIFIC_APPS =  new String[]{
        "best.camera",
        "net.sourceforge.opencamera",
        "com.google.android.GoogleCamera",
        "tools.photo.hd.camera",
};
private static List<ResolveInfo> getCameraSpecificAppsInfo(Context context){
    List<ResolveInfo> resolveInfo = new ArrayList<>();
    if (Utils.isNull(context)){
        return resolveInfo;
    }
    PackageManager pm = context.getPackageManager();
    for (String packageName : CAMERA_SPECIFIC_APPS) {
        resolveInfo.addAll(getCameraSpecificAppInfo(packageName, pm));
    }
    return resolveInfo;
}
private static List<ResolveInfo> getCameraSpecificAppInfo(String packageName, PackageManager pm){
    Intent specificCameraApp = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    specificCameraApp.setPackage(packageName);
    return pm.queryIntentActivities(specificCameraApp, 0);
}

当然,在清单文件中,我们应该添加这些行(如接受答案中所述)

<queries>
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE" />
        </intent>
</queries>
许兴文
2023-03-14

如果您的应用程序运行在目标SdkVersion 30上,则会返回一个EMPTY列表。

要解决此问题,您必须使用

修复图像捕获图像上传以使用Android“范围存储”

该问题可能与新包的可见性有关(https://developer.android.com/about/versions/11/privacy/package-visibility).在所有更新(至少Android Studio 4.1)后,尝试在清单中添加显示应用程序中需要执行的操作的内容。

在我的例子中,当我为相机添加图像捕获、为GALLERY获取内容(要获取文件,请更改mimeType,如果你想要视频)、为GALLERY选择(如果你想要视频,请更改mimeType)和为GALLERY选择(如果有人有其他图像浏览器)时,问题就消失了

您还可以在logcat中检查您必须添加的查询(应该包含“已阻止”或“无权限”。错误是因为ImagePickerModule当您没有使用resolveActivity的权限时,返回null(您可以在startActivityForResult中对其进行注释以检查更好的错误)

添加

<manifest>
.....
.....
<queries>
    <!-- Browser -->
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="http" />
    </intent>
    <!-- Camera -->
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
    <!-- Gallery -->
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*" />
    </intent>
    <intent>
        <action android:name="android.intent.action.PICK" />
        <data android:mimeType="image/*" />
    </intent>
    <intent>
        <action android:name="android.intent.action.CHOOSER" />
     </intent>
</queries>
.....
.....
</manifest>

罗晨
2023-03-14

Android 11改变了应用程序查询和与其他应用程序交互的方式。

来自文档:

返回其他应用程序结果的PackageManager方法,例如queryIntentActivities(),会根据调用应用程序的

所以你需要声明

<manifest package="com.example">
    <queries>
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE" />
        </intent>
    </queries>
    ...
</manifest>

 类似资料:
  • 我有一个奇怪的怪癖,当我运行一个nativeQuery调用单个列中的所有不同值时,我没有得到任何结果。然而,当我从查询中删除“distinct”操作符时,它的工作非常好,告诉我这不是数据库连接或内容问题。 控制器方法: 显然,我可以编写一个“distinct”方法来遍历这个列表,但对我来说,查询不起作用似乎很奇怪 编辑:在备注中请求的存储库和实体类中添加 资源库接口: 创建和修改表的SQL

  • 我从girdview适配器类调用startActivityForResult事件。Gridview适配器类是由myFragment类创建的。intent extras始终返回null onActivityResult事件。你认为错误在哪里?谢了。 我的gridview适配器类; onActivityResult事件的MyFragment类

  • 我正在尝试从我的应用打开Gmail(点击按钮)。我只在Android11中面临这个问题。这不是打开Gmail。在本例中,QueryInputActivities返回空列表。 请帮助我解决android 11的这个问题。下面是我正在使用的代码。。

  • 有人能告诉我为什么列表返回空吗?我的xpath是准确的,因为我重新检查了它,但我仍然无法迭代它,而调试for循环甚至没有执行。我不确定我哪里出了问题。

  • 我试图捕捉图像和视频从我的android应用程序与默认相机使用意图。 使用上面的代码,我试图捕获图像,在中,我在处的数据中获得了Null 我尝试用意图传递Uri,但Uri为空。 相机意图无法在URI上写入图像。我需要uri以电子邮件发送图像视频。 错误日志

  • 我有一个简单的kafka streams应用程序,它利用交互式查询并使用RESTfull进行实例通信。 该应用程序在docker之外使用多个流实例运行良好。并且流#allMetadata()返回所有正在运行的实例的正确列表。但是,一旦我在docker中运行应用程序,流#allMetadata()的结果是一个空数组[]。 注意:在docker中运行时,除了其他实例的可发现性之外,一切都正常。【我可以