未找到使用有效 url 处理 Intent 错误的活动
Posted
技术标签:
【中文标题】未找到使用有效 url 处理 Intent 错误的活动【英文标题】:No Activity found to handle Intent error with valid url 【发布时间】:2020-03-16 04:27:02 【问题描述】:我有这个小方法:
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.***.com/
这是堆栈跟踪的开始:
由 android.content.ActivityNotFoundException 引起:未找到处理 Intent 的 Activity act=android.intent.action.VIEW dat=http://wwww.***.com/...
我无法在我的手机上重现此问题,用户在华为 Y5 (DRA-L21) Android 8 上遇到此错误,有时在装有 android 9 的小米设备上。
【问题讨论】:
【参考方案1】:您正在使用implicit intents 打开一个网络链接。用户可能没有任何应用程序来处理您发送到startActivity()
的隐式意图。或者,由于管理员设置的配置文件限制或设置,应用程序可能无法访问。如果发生这种情况,调用将失败并且您的应用程序崩溃。要验证该活动是否会收到意图,请在您的 Intent
对象上调用 resolveActivity()
。如果结果不为空,则至少有一个应用程序可以处理该意图,并且可以安全地调用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);
【讨论】:
非常感谢!【参考方案2】:这可能发生的情况有很多,包括:
用户不是主要设备所有者,而是使用受限配置文件,该用户无权访问 Web 浏览器
用户通过设置禁用了所有 Web 浏览器应用
用户处于某些特定于设备的“家庭”模式,其中 Web 浏览器碰巧不可用
用户可用的 Web 浏览器不再支持用于外部链接的纯 HTTP,而是更喜欢 HTTPS
永远不要假设您可以启动第三方应用程序,即使对于像 Web 浏览器这样常见的应用程序也是如此。始终将启动第三方应用程序的 startActivity()
和 startActivityForResult()
调用包装在 try
/catch
块中并捕获 ActivityNotFoundException
。
【讨论】:
非常感谢!以上是关于未找到使用有效 url 处理 Intent 错误的活动的主要内容,如果未能解决你的问题,请参考以下文章
未找到处理 Intent 的活动 - android.intent.action.OPEN_DOCUMENT
尝试打开 word 文件或 excel 文件时未找到处理 Intent 的活动
ActivityNotFoundException:未找到处理 Intent 可疑行为的活动