android 11 kotlin 中的包可见性

package visibility in android 11 kotlin

我想找到安装在设备上的电子邮件客户端并在该应用程序上重定向电子邮件 ID 以发送电子邮件。它在 android 10 下工作正常,但在 android 11 上不工作。我找到了关于 Package visibility filtering on Android 11 的文章。在android11

中我不明白如何实现这个代码功能
request?.url.toString().startsWith("mailto:") -> {
       val intent = Intent(Intent.ACTION_SENDTO)
       intent.type = "message/rfc822"
       intent.data = Uri.parse(request?.url.toString())
        view?.context?.packageManager?.let { packageManager ->
        if (packageManager.resolveActivity(intent, 0) != null) {
            view.context?.startActivity(intent)
        } else {
          Log.E("Error to find ", "Email client")
        }
     }
}

它在低于 android 10 上启动电子邮件客户端,但无法在 android 11[=21= 中找到电子邮件客户端].它总是显示 Error to find Email client。有人可以更详细地向我解释 Android 11 上的包可见性过滤是如何工作的,有人可以分享一些代码如何实现这一点。

由于您的应用面向 Android 11 或更高版本并且需要与自动可见的应用以外的应用进行交互,因此请在您应用的清单中添加 queries 元素文件。在该元素中,按包名称、意图签名或提供者权限指定其他应用程序。

要查看其他包,请使用该元素声明您的应用需要提高包的可见性。

<manifest...>
     <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    <application>
    </application>
</manifest>

如果您的应用可能需要查询设备上所有已安装的应用或与之交互(这种情况很少见),您可以选择 QUERY_ALL_PACKAGES 中引入的权限 Android11.

如果 resolveActivity() return null 则尝试使用 queryIntentActivities()

更多请参考:https://developer.android.com/training/package-visibility/declaring