在API 30中,intent.resolveActivity返回null

126

查看intent.resolveActivity != null但启动意图会引发ActivityNotFound异常,我编写了使用深度链接打开浏览器或应用程序的代码:

private fun openUrl(url: String) {
    val intent = Intent().apply {
        action = Intent.ACTION_VIEW
        data = Uri.parse(url)
//        setDataAndType(Uri.parse(url), "text/html")
//        component = ComponentName("com.android.browser", "com.android.browser.BrowserActivity")
//        flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + Intent.FLAG_GRANT_READ_URI_PERMISSION
    }
    val activityInfo = intent.resolveActivityInfo(packageManager, intent.flags)
    if (activityInfo?.exported == true) {
        startActivity(intent)
    } else {
        Toast.makeText(
            this,
            "No application can handle the link",
            Toast.LENGTH_SHORT
        ).show()
    }
}

它不起作用。在API 30模拟器中找不到浏览器,而常见的解决方法有效:

private fun openUrl(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    try {
        startActivity(intent)
    } catch (e: ActivityNotFoundException) {
        Toast.makeText(
            this,
            "No application can handle the link",
            Toast.LENGTH_SHORT
        ).show()
    }
}
第一种方法行不通,因为intent.resolveActivityInfo或者intent.resolveActivity会返回null。但是对于PDF查看器,它有效

我们应该取消使用intent.resolveActivity吗?


7
假设您的目标 API 级别为 30,这似乎是由于这个原因:Android 11 中的包可见性。确实,当我在清单文件中加上一个适当的<queries>元素并测试您的第一个代码片段时,它按预期工作。如果您不想包含这样的<queries>元素,则可以继续使用 try-catch - Mike M.
@MikeM.,谢谢!你能把它发表为答案吗?我稍后会测试它。 - CoolMind
哦,抱歉,我误读了你的评论。我以为你会在测试后发布它。我现在无法提供一个合适的答案,但是等我有空了,我会回来解答的。如果你只是想完成这个问题,请随意自己发布一个问题。我并不是非常担心声望或其他什么。 :-) 干杯! - Mike M.
抱歉让你等这么久。我真的想找到一些与你的具体示例更相关的文档或源代码,但我没有找到。然后我有点忘了它。我的错。干杯! - Mike M.
11个回答

0

替换

val activityInfo = intent.resolveActivityInfo(packageManager, intent.flags)
    if (activityInfo?.exported == true) {
        startActivity(intent)
    } else {
        Toast.makeText(
            this,
            "No application can handle the link",
            Toast.LENGTH_SHORT
        ).show()
    }

使用

if (requireActivity().packageManager.resolveActivity(intent,0) != null){
    startActivity(intent)
}else{
    Toast.makeText(
        this,
        "No application can handle the link",
        Toast.LENGTH_SHORT
    ).show()
}

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