android 11 kotlin 中的包可见性

Posted

技术标签:

【中文标题】android 11 kotlin 中的包可见性【英文标题】:package visibility in android 11 kotlin 【发布时间】:2021-08-03 23:05:02 【问题描述】:

我想找到设备上安装的电子邮件客户端,并在该应用程序上重定向电子邮件 ID 以发送电子邮件。它在 android 10 上运行良好,但在 android 11 中无法运行。我找到了关于 Package visibility filtering on Android 11 的文章。我不明白如何在 android 11 中实现此代码功能

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 中找不到电子邮件客户端。它总是显示查找电子邮件客户端时出错。谁能更详细地解释一下Android 11 上的包可见性过滤是如何工作的,有人可以分享一些代码如何实现这一点。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

应该接受这个答案,但应该避免使用QUERY_ALL_PACKAGES。

以上是关于android 11 kotlin 中的包可见性的主要内容,如果未能解决你的问题,请参考以下文章

安卓 11 |地图导航的包可见性更改

Kotlin 中布局的可见性

Android (Kotlin) - 导航操作取决于可见的片段视图

从Kotlin构造函数android中的Parcelable读取List列表

spinner android kotlin 的自定义适配器不可见,但在单击下拉值时可见

Android - Kotlin 文件在编译后存在于 apk 中