在Android 11中,queryIntentActivities返回空列表

14

我想在我的应用程序中打开Gmail(点击按钮)。 我只在Android 11上遇到问题。 它无法打开Gmail。在这种情况下,queryIntentActivities返回空列表。

请帮助我如何解决Android 11的此问题。 以下是我正在使用的代码..

 val pkgManager = aContext.packageManager
            val packages = pkgManager.queryIntentActivities(intent, 0)
            if (!packages.isEmpty()) {
                for (resolveInfo in packages) {
                    val packageName = resolveInfo.activityInfo.packageName
                    aEmailClientNames.add(resolveInfo.loadLabel(aContext.packageManager).toString())
                    aEmailClientIcons.add(resolveInfo.loadIcon(aContext.packageManager))
                    aEmailClientPackageNames.add(packageName)
                }

你检查了这个吗? - Piyush
是的,我检查过了。那是用于打开图像的。他们在清单文件中添加查询。在清单中添加什么查询可以打开Gmail应用程序?我尝试了很多次,但没有得到结果。 - Preeti Tiwari
1
添加权限之后,它可以工作了 <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> - Preeti Tiwari
1
“在清单文件中添加什么查询以打开 Gmail 应用程序?”-- 你需要一个与你在代码片段的第二行中指定的 intent 匹配的查询。 “添加了权限后它可以工作了”--请注意,除非你能向 Google 提供为什么需要此权限的理由,否则你可能会被 Play 商店禁止。 - CommonsWare
2个回答

20

packageManager.queryIntentActivities(intent, 0) 如果您的应用程序运行在 targetSdkVersion 30 上,将返回空列表。为了解决这个问题,您需要在清单文件中使用 <queries> 来调用 queryIntentActivities() 方法,以根据调用应用程序的声明进行过滤。

修复图像捕获和图像上传以适配 Android 的 "scoped storage"

此问题可能与新的包可见性相关(https://developer.android.com/about/versions/11/privacy/package-visibility)。在所有更新(至少 Android Studio 4.1)之后,尝试在您的清单文件中添加 <queries>,以显示应用程序所需的操作。在我的情况下,当我添加以下内容时,问题消失了。

相机使用 IMAGE_CAPTURE,图库使用 GET_CONTENT(如果要获取视频文件,请更改 mimeType),PICK 用于从图库选择文件(如果需要视频,则应更改 mimetype),CHOOSER 用于其他图像浏览器)

您还可以在 logcat 中检查需要添加哪些查询(应包含 "BLOCKED" 或 "no permission")。错误是因为当您没有 Intent 权限时,ImagePickerModule 在带有 resolveActivity 的 Intent 中返回 null(您可以将其注释以在 startActivityForResult 中更好地检查错误)

AndroidMenifest.xml 中添加 <queries>

<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>

     <!--For external application-->
     <package android:name="com.whatsapp" />
</queries>
.....
.....
</manifest>

1
我有相同的问题。你提供的解决方案对我有所帮助,但是仍然不能获取通常可用于分享的所有应用程序(如WhatsApp、Facebook等)。还缺少什么? - Mehmed Mert
4
我刚刚意识到新添加的权限 android.permission.QUERY_ALL_PACKAGES 在清单文件中缺失。因此,加上这行代码后解决了我的问题: <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> - Mehmed Mert
@MehmedMert,你也可以在<queries>下添加特定的包来解决问题,例如对于Whatsapp,你可以添加<package android:name="com.whatsapp" />。请检查我的更新答案以获得更好的想法。 - ND1010_
完美的答案 <3 - ashif-ismail

1
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />

不要忘记在清单文件中粘贴这行代码


你不能使用这个权限将常规应用程序发布到GooglePlay。请参考https://support.google.com/googleplay/android-developer/answer/10158779?hl=en。 - undefined

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