未找到 Activity 来处理具有有效 url 的 Intent 错误
No Activity found to handle Intent error with valid url
我有这个小方法:
private fun showWebsiteWithUrl(url: String) {
val i = Intent(Intent.ACTION_VIEW)
i.data = Uri.parse(url)
startActivity(i)
}
而且我在 google 播放中看到有时此方法会抛出 android.content.ActivityNotFoundException
异常。
url
参数是有效的 url,如下所示:http://www.whosebug.com/
这是堆栈跟踪的开头:
Caused by android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://wwww.whosebug.com/... }
我无法在我的 phone 上重现该问题,用户在华为 Y5 (DRA-L21) Android 8 上遇到此错误,有时在 android 的小米设备上遇到此错误9.
在很多情况下都可能发生这种情况,包括:
该用户不是主要设备所有者,而是使用受限配置文件,该用户无权访问 Web 浏览器
用户通过“设置”禁用了所有 Web 浏览器应用程序
用户处于某些特定于设备的 "family" 模式,其中 Web 浏览器恰好不可用
用户可用的 Web 浏览器不再支持外部链接的纯 HTTP,更喜欢 HTTPS
永远不要假设您可以启动第三方应用程序,即使是像 Web 浏览器这样常见的应用程序。始终将在 try
/catch
块中启动第三方应用程序的 startActivity()
和 startActivityForResult()
调用包装起来,并捕获 ActivityNotFoundException
.
您正在使用 implicit intents 打开网页 link。用户可能没有任何应用程序来处理您发送给 startActivity()
的隐式意图。或者,由于管理员设置的配置文件限制或设置,应用程序可能无法访问。如果发生这种情况,调用将失败并且您的应用程序会崩溃。要验证 activity 是否会收到意图,请在您的 Intent
对象上调用 resolveActivity()
。如果结果为非空,则至少有一个应用程序可以处理该意图,并且调用 startActivity()
是安全的。如果结果为空,则不要使用该意图,如果可能,您应该禁用发出该意图的功能。以下示例显示如何验证意图是否解析为 activity。这个例子没有使用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);
}
我有这个小方法:
private fun showWebsiteWithUrl(url: String) {
val i = Intent(Intent.ACTION_VIEW)
i.data = Uri.parse(url)
startActivity(i)
}
而且我在 google 播放中看到有时此方法会抛出 android.content.ActivityNotFoundException
异常。
url
参数是有效的 url,如下所示:http://www.whosebug.com/
这是堆栈跟踪的开头:
Caused by android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://wwww.whosebug.com/... }
我无法在我的 phone 上重现该问题,用户在华为 Y5 (DRA-L21) Android 8 上遇到此错误,有时在 android 的小米设备上遇到此错误9.
在很多情况下都可能发生这种情况,包括:
该用户不是主要设备所有者,而是使用受限配置文件,该用户无权访问 Web 浏览器
用户通过“设置”禁用了所有 Web 浏览器应用程序
用户处于某些特定于设备的 "family" 模式,其中 Web 浏览器恰好不可用
用户可用的 Web 浏览器不再支持外部链接的纯 HTTP,更喜欢 HTTPS
永远不要假设您可以启动第三方应用程序,即使是像 Web 浏览器这样常见的应用程序。始终将在 try
/catch
块中启动第三方应用程序的 startActivity()
和 startActivityForResult()
调用包装起来,并捕获 ActivityNotFoundException
.
您正在使用 implicit intents 打开网页 link。用户可能没有任何应用程序来处理您发送给 startActivity()
的隐式意图。或者,由于管理员设置的配置文件限制或设置,应用程序可能无法访问。如果发生这种情况,调用将失败并且您的应用程序会崩溃。要验证 activity 是否会收到意图,请在您的 Intent
对象上调用 resolveActivity()
。如果结果为非空,则至少有一个应用程序可以处理该意图,并且调用 startActivity()
是安全的。如果结果为空,则不要使用该意图,如果可能,您应该禁用发出该意图的功能。以下示例显示如何验证意图是否解析为 activity。这个例子没有使用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);
}