如何解决android 11 kotlin 中的包可见性
我想找到安装在设备上的电子邮件客户端,并在该应用程序上重定向电子邮件 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 上的包可见性过滤 是如何工作的,有人可以分享一些如何实现这一点的代码。
解决方法
由于您的应用以 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。