在我的应用程序中,我收到用户插入的URL。此网址可以是 - 例如 - xx.sd
。使用任何Web浏览器,此URL都是有效的URL,但在尝试按意图打开时,会发生崩溃:android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=xx.sd }
。
我使用此
Patterns.WEB_URL.matcher(model.getTarget().getUrl()).matches()
使用此代码打开意图
Intent i = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(model.getTarget().getUrl()));
itemView.getContext().startActivity(i);
我知道我可以通过在网址之前附加http
或https
来解决此问题,如果不存在,但是如果我的网址开始使用其他协议,例如ftp
或file
等协议。任何人都可以帮我解决这个问题。
答案 0 :(得分:6)
正如您所说,这个问题与格式不正确的网址有关。
您可以检查网址的 ACTION_VIEW 意图。首先,这个resolveActivity函数检查是否存在可以加载URL的任何应用程序。这将解决崩溃问题。
public void openWebPage(String url) {
Uri webpage = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}else{
//Page not found
}
}
OR ,您可以通过异常处理来管理:
public void openWebPage(String url) {
try {
Uri webpage = Uri.parse(url);
Intent myIntent = new Intent(Intent.ACTION_VIEW, webpage);
startActivity(myIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "No application can handle this request. Please install a web browser or check your URL.", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
答案 1 :(得分:0)
添加un try-catch并再次调用,例如:
public boolean startOpenWebPage(String url) {
boolean result = false;
if (!url.startsWith("http://") && !url.startsWith("https://"))
url = "http://" + url;
Uri webpage = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
try {
startActivity(intent);
result = true;
}catch (Exception e){
if (url.startsWith("http://")){
startOpenWebPage(url.replace("http://","https://"));
}
}
return result;
}