5

我有这个小方法:

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

我在 google play 中看到有时这种方法会抛出android.content.ActivityNotFoundException异常。

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

这是堆栈跟踪的开始:

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

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

4

2 回答 2

6

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

// 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);
}
于 2019-11-20T12:59:04.773 回答
2

有很多情况可能会发生这种情况,包括:

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

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

  • 用户处于某些特定于设备的“家庭”模式,其中 Web 浏览器碰巧不可用

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

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

于 2019-11-20T12:57:12.627 回答