`shouldOverrideUrlLoading`은 실제로 더 이상 사용되지 않습니까? 대신 무엇을 사용할 수 있습니까?


138

"shouldOverrideUrlLoading"은 실제로 더 이상 사용되지 않습니까? 그렇다면 대신 무엇을 사용할 수 있습니까?

Android N을 타겟팅하는shouldOverrideUrlLoading 것이 더 이상 사용되지 않는 것 같습니다. API 19부터 Android N (베타) 인 최신 앱까지 작동시켜야합니다 .Android N의 새로운 기능 (예 : Data Saver)을 사용하므로 타겟팅 Marshmallow는 새로운 기능을 사용해야하므로이 문제에 도움이되지 않습니다. 다음은 사용하는 코드의 일부입니다.

public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

그리고 이것은 Android Studio가 나에게 준 메시지입니다.

'android.webkit.WebViewClient'에서 사용되지 않는 메소드를 대체합니다.이 검사는 사용되지 않는 코드가 지정된 검사 범위에서 사용되는 위치를보고합니다.

Google은 그 지원 중단에 대해 아무 말도하지 않습니다 .

@SuppressWarnings("deprecation")API 19부터 최신 Android N Beta (및 최종 버전이 출시 될 때까지의 최종 버전)까지 모든 장치에서 사용할 수 있는지 궁금합니다. 테스트 할 수는 없으며 절대 사용하지 않았으므로 확실해야합니다. 그것이 작동하므로 누구나 말할 수 있습니까?


1
해당 콜백 메소드에는 두 가지 버전이 있습니다. 오래된 것은 더 이상 사용되지 않습니다. 이 경우 "더 이상 사용되지 않음"은 "이봐, 우리는 당신에게 적합하다면 시도해 볼 수있는 다른 것을 가지고 있습니다"를 의미합니다. N 이전 버전의 Android에는 이전 콜백이 필요하므로 이전 콜백은 계속 작동합니다.
CommonsWare

먼저 의견에 감사드립니다. 사용하고있는 버전이 좋은 것이라고 생각합니다. 문자열 이름을 제외하고는 Android 개발자 문서와 정확히 동일하기 때문에 "view"를 사용하고 "webview"를 사용했습니다 나머지는 동일하기 때문에 왜 모든 버전에서 작동하게해야합니까?
Minion

답변:


95

내가 사용하고있는 버전은 좋은 것이라고 생각합니다. 문자열 이름을 제외하고는 Android 개발자 문서와 동일하기 때문에 "view"를 사용하고 "webview"를 사용했습니다. 나머지는 동일합니다.

전혀 그렇지 않다.

N Developer Preview의 새로운 기능에는 다음과 같은 메소드 서명이 있습니다.

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

N을 포함한 모든 Android 버전에서 지원되는 버전에는 다음과 같은 메소드 서명이 있습니다.

public boolean shouldOverrideUrlLoading(WebView view, String url)

그렇다면 왜 모든 버전에서 작동하게해야합니까?

더 이상 사용되지 않는 항목을 String두 번째 매개 변수로 사용하는 항목을 대체하십시오 .


안녕하세요, 답변에 감사드립니다. API 19 이후에도 여전히 호환되지 않습니다 .URL 문자열을 얻으려면 "url.getUrl (). toString ()"을 사용해야하고 API 21에 추가되었으므로 API 19부터 작동합니까?
Minion

3
@Minion : "API 19 이후에도 여전히 호환되지 않습니다"-예, 그렇습니다. "URL 문자열을 가져 오기 때문에"url.getUrl (). toString () "을 사용해야합니다."-아니요, URL은 두 번째 매개 변수로 형식으로 제공됩니다 String. 예를 들어 API 레벨 19에 대해 컴파일 된 이 샘플 앱 은 Android 6.0 기반 Nexus 5와 같이 잘 작동합니다.
CommonsWare

안녕하세요, "WebResourceRequest request"를 사용하면 String 매개 변수가 없습니다
Minion

2
@Minion : 맞습니다. 그것은 Android N에서만 작동하며 아마도 더 높을 수도 있습니다. "왜 모든 버전에서 작동하게해야합니까?"라고 물었습니다. 더 이상 사용되지 않는 것을 재정의하라고 말했는데 String두 번째 매개 변수로 사용됩니다. 예를 들어, 더 이상 사용되지 않는 콜백을 재정의하는 링크 된 샘플 앱은 N Developer Preview 1을 실행하는 Nexus 6에서
제대로

6
미래에 대비하고 싶다면 실제로 BOTH 메소드를 대체 할 수 있습니다. 이렇게하면 앱이 21 미만에서 계속 작동하지만 이전 방법을 완전히 폐기하면 준비가 완료됩니다. 그리고 당신에 대해 걱정할 필요가 없습니다 getUrl()새로운 방법은 24+ 요구되기 때문에
Yuval 교수

187

미래 독자를위한 세부 문서화 :

짧은 대답은 두 방법을 모두 무시해야한다는 것입니다. 이 shouldOverrideUrlLoading(WebView view, String url)메소드는 API 24에서 더 이상 사용되지 않으며 메소드가 API 24에서 shouldOverrideUrlLoading(WebView view, WebResourceRequest request)추가됩니다. 이전 버전의 Android 를 대상으로하는 경우 이전 방법 이 필요 하고 24를 대상으로하는 경우 (또는 나중에 먼 미래에이 기사를 읽는 경우) 후자의 방법을 재정의하는 것이 좋습니다.

아래는이 작업을 수행하는 방법에 대한 골격입니다.

class CustomWebViewClient extends WebViewClient {

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        final Uri uri = Uri.parse(url);
        return handleUri(uri);
    }

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

    private boolean handleUri(final Uri uri) {
        Log.i(TAG, "Uri =" + uri);
        final String host = uri.getHost();
        final String scheme = uri.getScheme();
        // Based on some condition you need to determine if you are going to load the url 
        // in your web view itself or in a browser. 
        // You can use `host` or `scheme` or any part of the `uri` to decide.
        if (/* any condition */) {
            // Returning false means that you are going to load this url in the webView itself
            return false;
        } else {
            // Returning true means that you need to handle what to do with the url
            // e.g. open web page in a Browser
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            return true;
        }
    }
}

마찬가지로 shouldOverrideUrlLoading, 방법에 대한 비슷한 접근 방식을 생각해 낼 수 있습니다 shouldInterceptRequest.



3
@RequiresApi나중에 사용하기 위해 @TargetApi 대신 사용하는 것이 좋습니다.
Hibbem

1
적어도 두 가지 방법을 재정의하는 문제 shouldInterceptRequest는 Android N + 기기에서 모두 호출되고 각 URI를 두 번 처리한다는 것입니다! 이를 해결하기 위해 Build.VERSION.SDK_INT < Build.VERSION_CODES.N더 이상 사용되지 않는 버전 의 조건을 추가했습니다 .
Jonik

8
@JohnLee 일반적으로 메소드 중 하나만 호출됩니다. 그러나 super. shouldOverrideUrlLoading(view,request)더 이상 사용되지 않는 메소드 를 넣으면 더 이상 사용되지 않는 메소드와 더 이상 사용되지 않는 메소드가 호출됩니다. 사용되지 않는 메소드의 기본 구현은 사용되지 않는 메소드를 내부적으로 호출하기 때문입니다. 를보십시오 WebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request). 전화하지 마십시오 super.shouldOverrideUrlLoading().
Henry

1
두 메소드를 모두 호출하는 기능이 문서화되어 있지 않음을 지적합니다. 나는 그것이 문서에 언급되지 않았기 때문에 항상 그런 경우에 의존하지 않을 것입니다.
오스틴 마호니

15

사용하다

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

2
view.loadUrl (request.getUrl (). toString ());
Hibbem

작동하지만 다시 사용하면 앱이 닫힙니다
MRRaja

4
이것은 21보다 작은 api를 지원하지 않을 것입니다
mumair

-1

다음과 같이 사용되지 않는 방법과 사용되지 않는 방법을 모두 구현하십시오. 첫 번째는 API 레벨 21 이상을 처리하는 것이고, 두 번째는 API 레벨 21보다 낮은 핸들을 처리하는 것입니다

webViewClient = object : WebViewClient() {
.
.
        @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            parseUri(request?.url)
            return true
        }

        @SuppressWarnings("deprecation")
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            parseUri(Uri.parse(url))
            return true
        }
}

1
이것은 Henry의 답변의 일부 사본 인 것처럼 보이지만 Uri.parseand에서 반환 한 값을 버립니다 parseUri. 새로운 답변은 주제에 유용한 새로운 정보와 새로운 통찰력을 추가해야합니다.
AdrianHHH

API는 API 24에 사용되지 않으며 없습니다 (21) 때문에 나 시간을 잃는
구스타보 Baiocchi 코스타
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.