Android WebView, cách xử lý chuyển hướng trong ứng dụng thay vì mở trình duyệt


120

Vì vậy, ngay bây giờ trong ứng dụng của tôi, URL tôi đang truy cập có chuyển hướng và khi điều này xảy ra, WebView sẽ mở một trình duyệt mới, thay vì ở trong ứng dụng của tôi. Có cách nào tôi có thể thay đổi cài đặt để Chế độ xem sẽ chuyển hướng đến URL như bình thường, nhưng vẫn ở trong ứng dụng của tôi thay vì mở trình duyệt mới không?

Biên tập:

Tôi muốn URL chuyển hướng, tôi không biết cách tạo nó, vì vậy cách duy nhất để truy cập URL đó là thông qua một URL sẽ chuyển hướng đến URL tôi muốn.

Ví dụ: Khi bạn truy cập vào đây: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 để ý cách nó sẽ chuyển hướng URL đến sản phẩm thực tế. Trong ứng dụng của tôi, nếu tôi mở nó trong một trình duyệt mới, nó sẽ hoạt động tốt, tuy nhiên nếu tôi giữ nó trong ứng dụng của mình bằng WebView, nó sẽ hiển thị như thể nó đang thực hiện tìm kiếm k = 9780735622777, như thế này: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . HOẶC, nó sẽ mở chế độ xem trong trình duyệt và hiển thị những gì phù hợp. Tuy nhiên, tôi muốn giữ mọi thứ trong ứng dụng của mình.

Câu trả lời:


253

Tạo một WebViewClient và ghi đè phương thức 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
Tôi yêu câu trả lời rằng cũng giống như phương pháp () {// chỉ cần đặt đoạn code bạn không biết làm thế nào để sử dụng ở đây}
JMRboosties

19
Vui lòng không sao chép mã trên. Trả về false từ callback thay vì gọi view.loadUrl. Gọi loadUrl giới thiệu một lỗi nhỏ trong đó nếu bạn có bất kỳ iframe nào trong trang có URL lược đồ tùy chỉnh (giả sử <iframe src = "tel: 123" />), nó sẽ điều hướng khung chính của ứng dụng của bạn đến URL đó rất có thể làm hỏng ứng dụng như Một tác dụng phụ.
marcin.kosiba

@ marcin.kosiba phụ thuộc vào cách nó được sử dụng, đối với trường hợp sử dụng của tôi những gì bạn mô tả không phải là một vấn đề nhưng tôi vẫn đánh giá cao người đứng đầu lên :)
Warpzit

@Warpzit - chắc chắn, nếu bạn chỉ tải nội dung đáng tin cậy vào webview và đảm bảo 100% rằng không ai có thể khai thác trục trặc đó, tốt thôi. OTOH tại sao lại gặp rủi ro?
marcin.kosiba

1
Làm thế nào tôi có thể biết url được gọi vào shouldOverrideUrlLoadingphương thức là url chuyển hướng tiếp theo? Và tôi muốn cho phép nó?
Phan Sinh

21

Theo tài liệu chính thức , một cú nhấp chuột vào bất kỳ liên kết nào trong WebView sẽ khởi chạy một ứng dụng xử lý URL, theo mặc định là một trình duyệt. Bạn cần ghi đè hành vi mặc định như thế này

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

8
Thậm chí tốt hơn chỉ cần gọi myWebView.setWebViewClient (WebViewClient mới ()); Việc triển khai mặc định shouldOverrideUrlLoading trả về false.
cyroxis

14

Chỉ cần thêm một tùy chỉnh mặc định WebViewClientsẽ làm được. Điều này làm cho WebView tự xử lý bất kỳ url đã tải nào.

mWebView.setWebViewClient(new WebViewClient());

8

Bạn sẽ phải đặt phương thức ghi đè WebviewClient tùy chỉnh của mình cho phương thức shouldOverrideUrlLoading cho chế độ xem web của mình trước khi tải url.

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.
            }
        });

Kiểm tra mã ví dụ để xử lý các url chuyển hướng và mở PDF mà không cần tải xuống, trong webview. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Lưu ý rằng liên kết ở trên cho một mã mẫu không tồn tại.
Jetdog

tôi đã tải lên liên kết.
Ashish Das

Đã làm việc cho tôi Cảm ơn bạn @AshishDas +10
livemaker

2

Vui lòng sử dụng mã kotlin dưới đây

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

Để biết thêm thông tin bấm vào đây


2

Tạo một lớp triển khai webviewclient và thêm mã sau cho phép mã hóa chuỗi url như được hiển thị bên dưới. Bạn có thể xem những [ví dụ] [1] này

public class myWebClient extends WebViewClient {

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

Trên phương thức khởi tạo của bạn, hãy tạo một đối tượng webview như được hiển thị bên dưới.

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

Sau đó, thêm mã sau để thực hiện tải các url bên trong ứng dụng của bạn

       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);
        
    }
}

Xin chào Chào mừng bạn, bạn có muốn giải thích mã của mình và cho chúng tôi biết tại sao đây là câu trả lời đúng không?
Ali
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.