如何在Android 11上使用startActivityForResult?

3

我正在使用 startActivityForResult() 将图像加载到我的应用程序中,类似于以下操作:

val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
if (intentForLoadingImage.resolveActivity(packageManager) != null) {
    startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
}

我已经重写了onActivityResult(),用于将图像加载到ImageView中。它适用于所有的Android版本(我的应用程序的minSdkVersion是21),但在Android 11上完全没有反应。因为intentForLoadingImage.resolveActivity(packageManager)返回null,图片加载的活动并未启动。

2个回答

6
我了解到Android 11上关于应用程序包可见性隐私更新。其中提到:

Android 11改变了应用程序如何查询和与用户在设备上安装的其他应用程序交互的方式。使用元素,应用程序可以定义它们可以访问的其他软件包集。此元素有助于通过告知系统要向您的应用程序公开哪些其他软件包来鼓励最小特权原则,并帮助Google Play等应用商店评估您的应用程序为用户提供的隐私和安全性。

如果您的应用程序针对Android 11或更高版本,则可能需要在应用程序清单文件中添加元素。在元素内,您可以按名称、意图签名或提供者权限指定软件包。

因此,我在我的清单文件中添加了以下标记:

<queries>
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*"/>
    </intent>
</queries>

就是这样!


2
根据ACTION_GET_CONTENT文档,实际字符串为android.intent.action.GET_CONTENT而不是您代码中的android.media.action.GET_CONTENT。因此,正确的包可见性查询为:
<queries>
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*"/>
    </intent>
</queries>

作为一种替代方法,您也可以捕获ActivityNotFoundException。这种情况很少发生,只会在自定义ROM中禁用存储访问框架(处理ACTION_GET_CONTENT)时发生。此方法不需要包可见性标签:
val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
try {
    startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
} catch (e: ActivityNotFoundException) {
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接