查看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
吗?
<queries>
元素并测试您的第一个代码片段时,它按预期工作。如果您不想包含这样的<queries>
元素,则可以继续使用try-catch
。 - Mike M.