Android WebView、ブラウザーを開く代わりにアプリでリダイレクトを処理する方法


120

したがって、現在の私のアプリでは、アクセスしているURLにリダイレクトがあります。これが発生すると、WebViewはアプリに留まる代わりに新しいブラウザを開きます。ビューが通常のようにURLにリダイレクトされるように設定を変更できる方法はありますが、新しいブラウザーを開くのではなくアプリ内に留まりますか?

編集:

リダイレクトURLが必要ですが、作成方法がわからないので、そのURLにアクセスする唯一の方法は、目的のURLにリダイレクトするURLを経由することです。

例:ここにアクセスすると、http//www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777が実際の製品にURLをリダイレクトする方法に注意してください。私のアプリでは、新しいブラウザーで開くと問題なく動作しますが、WebViewを使用してアプリに保持すると、次のようにk = 9780735622777を検索しているように表示されます。http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0。または、ブラウザでビューを開き、適切なものを表示します。ただし、すべてをアプリ内に残しておきたいと思います。

回答:


253

WebViewClientを作成し、shouldOverrideUrlLoadingメソッドをオーバーライドします。

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});

8
method()のような答えが好きです{//ここに使用方法がわからないコードを置くだけです}
JMRboosties

19
上記のコードを複製しないでください。代わりにview.loadUrlを呼び出す代わりに、コールバックからfalseを返します。loadUrlを呼び出すと、カスタムスキームURL(たとえば、<iframe src = "tel:123" />)が含まれるページ内にiframeがある場合に、アプリのメインフレームがそのURLに移動し、アプリが次のように壊れる可能性が高いという微妙なバグが発生します。副作用。
marcin.kosiba 2014

@ marcin.kosibaは、それがどのように使用されるかによって異なります。私のユースケースでは、あなたが説明することは問題ではありませんが、私はまだヘッドアップに感謝しています:)
Warpzit

@Warpzit-確かに、信頼できるコンテンツのみをWebviewにロードし、そのグリッチを悪用できないことを100%保証している場合は問題ありません。OTOHなぜリスクを実行するのですか?
marcin.kosiba 2016年

1
shouldOverrideUrlLoadingメソッドに呼び出されたURL が次のリダイレクトURLであることをどのようにして知ることができますか?そして、私はそれを許可したいですか?
ファンシン、

21

公式ドキュメントによると、WebViewのリンクをクリックすると、URLを処理するアプリケーションが起動します。これはデフォルトではブラウザです。このようなデフォルトの動作をオーバーライドする必要があります

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

8
さらに良いのは、myWebView.setWebViewClient(new WebViewClient());を呼び出すだけです。shouldOverrideUrlLoadingのデフォルト実装はfalseを返します。
シロキシス2015年

14

デフォルトのカスタムWebViewClientを追加するだけで十分です。これにより、WebViewはロードされたURL自体を処理します。

mWebView.setWebViewClient(new WebViewClient());

8

URLをロードする前に、カスタムWebviewClientがWebViewのshouldOverrideUrlLoadingメソッドをオーバーライドするように設定する必要があります。

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
            {
                Uri uri = request.getUrl();
                return shouldOverrideUrlLoading(uri.toString());
            }

            private boolean shouldOverrideUrlLoading(final String url)
            {
                Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

リダイレクトURLを処理するサンプルコードをチェックアウトし、ダウンロードせずにPDFをWebビューで開きます。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


上記のコード例のリンクは存在しないことに注意してください。
Jetdog

リンクをアップロードしました。
Ashish Das

私のために働いたありがとう@AshishDas +10
livemaker

2

以下のkotlinコードを使用してください

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

詳細については、ここをクリックしてください


2

webviewclientを実装するクラスを作成し、以下に示すようにURL文字列の検証を可能にする次のコードを追加します。これらを見ることができます[例] [1]

public class myWebClient extends WebViewClient {

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url); 
         return true;
     }
}

コンストラクターで、以下に示すようにwebviewオブジェクトを作成します。

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

次に、次のコードを追加して、アプリ内でURLのロードを実行します

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }

0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}

こんにちはようこそ、コードを説明して、なぜこれが正しい答えなのかを教えてください。
アリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.