`shouldOverrideUrlLoading`は本当に非推奨ですか?代わりに何を使用できますか?


138

「shouldOverrideUrlLoading」は本当に非推奨ですか?その場合、代わりに何を使用できますか?

Android NのターゲティングshouldOverrideUrlLoadingは廃止されたようです。API19 以降、最新のAndroid N(ベータ版)までアプリを機能させる必要があります。AndroidNの新機能(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ベータ版(および最終バージョンがリリースされたとき)まで使用すると、すべてのデバイスで動作するようになるのでしょうか、自分でテストすることはできません。それが機能するので、誰でもわかるでしょうか?


1
そのコールバックメソッドには2つのバージョンがあります。古いものは非推奨です。この場合、「非推奨」とは、「適切な場合は、他にも試してみたいことがある」という意味です。AndroidのN以前のバージョンには古いコールバックが必要であるため、古いコールバックは引き続き機能します。
CommonsWare 2016

まず、コメントのおかげで、私が使用しているバージョンは良いバージョンだと思います。文字列の名前を除いてAndroid Developer Docsとまったく同じなので、「view」を使用し、「webview」を使用しました。 、残りは同じなので、なぜすべてのバージョンで機能させる必要があるのですか?
ミニオン

回答:


95

私が使用しているバージョンは良いと思います。文字列の名前を除いてAndroid Developer Docsとまったく同じなので、「view」を使用し、残りは「webview」を使用しました。

いいえそうではありません。

N Developer Previewの新機能には、次のメソッドシグネチャがあります。

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

Nを含むすべてのAndroidバージョンでサポートされているものには、次のメソッドシグネチャがあります。

public boolean shouldOverrideUrlLoading(WebView view, String url)

それでは、なぜすべてのバージョンで機能させる必要があるのですか?

廃止予定のString、2番目のパラメーターとしてaを取るものをオーバーライドします。


こんにちは、回答に感謝します。API19以降はまだ互換性がありません。URL文字列を取得するには「url.getUrl()。toString()」を使用する必要があり、API 21に追加されているため、 API 19以降で機能しますか?
ミニオン

3
@Minion:「API 19以降、まだ互換性はありません」-はい、そうです。「URL文字列を取得するため、「url.getUrl()。toString()」を使用する必要があります」-いいえ、URLは2番目のパラメータとしての形式で提供されますString。たとえば、APIレベル19に対してコンパイルされたこのサンプルアプリは、Android 6.0搭載のNexus 5などで
正常に動作し

こんにちは、 "WebResourceRequestリクエスト"を使用すると、文字列パラメータがありません
ミニオン

2
@ミニオン:正解。これはAndroid N(おそらく、それ以上)でのみ機能します。あなたは「それで、なぜそれをすべてのバージョンで動作させるために何をすべきなのか」と尋ねました。廃止予定のString、2番目のパラメーターとしてaを取るものをオーバーライドするように言った。例えば、推奨されないコールバックを上書きします、私はにリンクされていることをサンプルアプリは、Nの開発者プレビュー1を実行しているネクサス6で正常に動作します
CommonsWare

6
将来を見据えたい場合は、実際には両方のメソッドをオーバーライドできます。これにより、アプリは21未満でも引き続き機能しますが、古いメソッドが完全に非推奨になれば、準備は完了です。そして、あなたは心配する必要はありませんgetUrl()新しい方法のみ24+のために呼び出されますので、
のYuval

187

今後の読者のために詳細を文書化:

簡単に言えば、両方のメソッドをオーバーライドする必要があります。shouldOverrideUrlLoading(WebView view, String url)この方法は、API 24で廃止され、shouldOverrideUrlLoading(WebView view, WebResourceRequest request)あなたは、Androidの古いバージョンをターゲットにしている場合の方法は、API 24に追加され、あなたが必要あなたが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;
        }
    }
}

と同様にshouldOverrideUrlLoadingshouldInterceptRequestメソッドについても同様のアプローチを考え出すことができます。


6
@ webo80実際にそれがAPI24 / Nの中に追加され developer.android.com/reference/android/webkit/...
ヘンリー・

3
@RequiresApi今後は、@ TargetApiの代わりに使用することをお勧めします
Hibbem

1
少なくともで両方のメソッドをオーバーライドする場合の問題shouldInterceptRequestは、Android N +デバイスでは両方が呼び出され、各URIを2回処理することです。それを改善するBuild.VERSION.SDK_INT < Build.VERSION_CODES.Nために、廃止予定バージョンに条件を追加しました。
Jonik

8
@JohnLee通常、呼び出されるメソッドは1つだけです。ただしsuper. shouldOverrideUrlLoading(view,request)、非推奨ではないメソッドを使用すると、非推奨ではないメソッドと非推奨のメソッドの両方が呼び出されます。これは、非推奨ではないメソッドのデフォルトの実装では、非推奨のメソッドを内部的に呼び出すためです。だけを見てくださいWebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request)。したがって、を呼び出さないようにしてくださいsuper.shouldOverrideUrlLoading()
ヘンリー

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 2017年

-1

以下のように非推奨メソッドと非推奨メソッドの両方を実装します。1つ目は、APIレベル21以上を処理するためのもので、2つ目は、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
これはヘンリーの回答の一部のコピーのようですが、これによりUri.parse、とによって返された値が破棄されparseUriます。新しい答えは、有用な新しい情報と新しい洞察をトピックに追加する必要があります。
AdrianHHH

APIは21ではなくAPI 24でのみ廃止されているため、時間を
無駄にしてしまいました
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.