Android WebView, 브라우저를 여는 대신 앱에서 리디렉션을 처리하는 방법


120

그래서 지금 내 앱에서 내가 액세스하는 URL에는 리디렉션이 있으며,이 경우 WebView는 내 앱에 머무르는 대신 새 브라우저를 엽니 다. View가 정상적으로 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 ()와 같은 대답을 좋아한다 {// 사용하는 방법을 모르는 코드를 여기에
넣으

19
위의 코드를 복제하지 마십시오. 대신 view.loadUrl을 호출하는 대신 콜백에서 false를 반환합니다. loadUrl을 호출하면 페이지 내에 사용자 정의 스키마 URL (예 : <iframe src = "tel : 123"/>)이있는 iframe이있는 경우 앱의 메인 프레임을 해당 URL로 이동하여 앱을 중단 할 가능성이 높은 미묘한 버그가 발생합니다. 부작용.
marcin.kosiba 2014

@ marcin.kosiba는 사용 방법에 따라 달라집니다. 제 사용 사례에 대해 설명하는 내용은 문제가되지 않지만 여전히
주의를 기울여

@Warpzit-물론 신뢰할 수있는 콘텐츠 만 웹뷰에로드하고 아무도 그 결함을 악용 할 수 없다는 100 % 보장이 있다면 괜찮습니다. OTOH 왜 위험을 감수합니까?
marcin.kosiba

1
shouldOverrideUrlLoading메소드로 호출 된 URL이 다음 리디렉션 URL 인지 어떻게 알 수 있습니까? 그리고 그것을 허용하고 싶습니까?
Phan Sinh

21

공식 문서 에 따르면 WebView의 링크를 클릭하면 기본적으로 브라우저 인 URL을 처리하는 응용 프로그램이 시작됩니다. 이와 같은 기본 동작을 재정의해야합니다.

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

8
myWebView.setWebViewClient (new WebViewClient ())를 호출하는 것이 더 좋습니다. shouldOverrideUrlLoading의 기본 구현은 false를 반환합니다.
cyroxis

14

기본 사용자 지정 만 추가하면 WebViewClient됩니다. 이렇게하면 WebView가로드 된 URL 자체를 처리합니다.

mWebView.setWebViewClient(new WebViewClient());

8

URL을로드하기 전에 웹뷰에 대해 shouldOverrideUrlLoading 메서드를 재정의하는 사용자 지정 WebviewClient를 설정해야합니다 .

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을 처리하는 예제 코드를 확인하고 webview에서 다운로드없이 PDF를 엽니 다. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


예제 코드에 대한 위 링크는 존재하지 않습니다.
Jetdog 2017 년

링크를 업로드했습니다.
Ashish Das

나를 위해 일한 당신이 10 @AshishDas 감사
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.