未找到用于处理具有有效 URL 的意向错误的活动



我有这个小方法:

private fun showWebsiteWithUrl(url: String) {
    val i = Intent(Intent.ACTION_VIEW)
    i.data = Uri.parse(url)
    startActivity(i)
}

我在谷歌播放中看到,有时这种方法会抛出android.content.ActivityNotFoundException异常。

url参数是一个有效的网址,如下所示:http://www.stackoverflow.com/

这是堆栈跟踪的开始:

由 android.content.ActivityNotFoundException 引起:未找到处理意图的活动 { act=android.intent.action.VIEW dat=http://wwww.stackoverflow.com/... }

我无法在手机上重现该问题,用户在华为Y5(DRA-L21(Android 8上收到此错误,有时在装有android 9的小米设备上收到此错误。

您正在使用隐式意图打开 Web 链接。用户可能没有任何应用来处理你发送给startActivity()的隐式意图。或者,由于管理员设置的配置文件限制或设置,应用可能无法访问。如果发生这种情况,调用将失败,应用将崩溃。若要验证活动是否将接收意向,请在Intent对象上调用resolveActivity()。如果结果为非 null,则至少有一个应用可以处理意向,并且可以安全地调用 startActivity() 。如果结果为 null,则不要使用该目的,如果可能,应禁用发出该目的的功能。下面的示例演示如何验证意向是否解析为活动。此示例不使用 URI,但声明了 Intent 的数据类型以指定附加内容携带的内容。

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

在许多情况下可能会发生这种情况,包括:

  • 用户不是主要设备所有者,而是使用受限配置文件,其中该用户无权访问 Web 浏览器

  • 用户通过"设置"禁用了所有 Web 浏览器应用

  • 用户处于某些特定于设备的"系列"模式,其中 Web 浏览器恰好不可用

  • 用户可用的 Web 浏览器不再支持外部链接的纯 HTTP,而是首选 HTTPS

永远不要假设您可以启动第三方应用程序,即使是像 Web 浏览器这样常见的应用程序。始终将startActivity()startActivityForResult()调用包装在try/catch块中并捕获ActivityNotFoundException

相关内容

  • 没有找到相关文章

最新更新