意图打开URL

时间:2017-05-15 13:22:21

标签: android url android-intent

在我的应用程序中,我收到用户插入的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);

我知道我可以通过在网址之前附加httphttps来解决此问题,如果不存在,但是如果我的网址开始使用其他协议,例如ftpfile等协议。任何人都可以帮我解决这个问题。

2 个答案:

答案 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;
}