2017-05-15 14 views
0

私のアプリケーションでは、ユーザーが挿入したURLを受け取ります。このURLは、たとえば、xx.sdとすることができます。任意のウェブブラウザを使用して、このURLは有効なURLですが、インテントで開こうとすると、クラッシュが発生します:android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=xx.sd }
私はURLであれば前にアペンドhttpまたはhttpsことで、この問題を解決することができます知っているこのコード
Open URL in intent

Intent i = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(model.getTarget().getUrl())); 
    itemView.getContext().startActivity(i); 

を使用して、この

Patterns.WEB_URL.matcher(model.getTarget().getUrl()).matches() 

とオープン意図を使用して、このURLが有効なURLでご確認ください私のURLがftpまたはfileなどのプロトコルのような別のプロトコルで始まっている場合は、誰も私がこの問題に対処するのを助けることができますか?

+0

のためのあなたの完全なURLを共有しますより良いans – Hasnain

+0

@ Hasnainあなたは 'stackoverflow.com'や' fb.com'や 'protocol'で始まっていないURLを使って問題を確認できます。' www' – MARK

+0

あなた自身のURLを共有してくださいここでは、あなたの問題に関する特別な研究開発を行うつもりはありません。 – Hasnain

答えて

3

この問題は実際には形式の正しくないURLに関係しているとお伝えしましたが、

ACTION_VIEWのURLのインテントを確認できます。まず、この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(); 
     } 
    } 
+0

** ActivityNotFoundException **がいつスローされるのですか? –

+0

このACTION_VIEWイベントを処理して、その時点で要求されたURLをロードできるアプリケーションがない場合、ActivityNotFoundExceptionがスローされます。それが起こらないようにするには、インテントアクションタイプに対してresolveActivityのチェックがある最初の関数を使用します。 –

+0

** ACTION_VIEW **の意図を処理しないAndroidデバイスが存在する可能性がありますか? –

0

国連の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; 
}