web-dev-qa-db-ja.com

WebViewの実装を決定する(システムWebViewまたはChrome)

Android 7.0では、ユーザーは(開発者オプションを介して)WebViewの実装を選択できます。ユーザーはスタンドアロンのWebViewを選択するか、Chrome APKを使用してWebViewをレンダリングできます。 参照

これは、WebViewを使用するユーザーが2つの異なるコードベースを心配する必要があることを意味する可能性があるため、現在どの実装が選択されているかを知っておくと便利です。

Android 7?で選択されているWebView実装を判別する方法はありますか?

9
DataDino

Android Oプレビュー:

リンク: https://developer.Android.com/preview/features/managing-webview.html

Android 7.0(APIレベル24)以降、ユーザーはWebViewオブジェクトにWebコンテンツを表示するためのいくつかの異なるパッケージから選択できます。AndroidOには次のAPIが含まれていますアプリでウェブコンテンツを表示しているパッケージに関連する情報を取得する。このAPIは、アプリが特定のパッケージのWebViewの実装を使用してウェブコンテンツを表示しようとしたときにのみ発生するエラーを分析する場合に特に役立ちます。 。

このAPIを使用するには、次のコードスニペットに示すロジックを追加します。

PackageInfo webViewPackageInfo = WebView.getCurrentWebViewPackage();
Log.d(TAG, "WebView version: " + webViewPackageInfo.versionName);

WebView.getCurrentWebViewPackageドキュメント: https://developer.Android.com/reference/Android/webkit/WebView.html#getCurrentWebViewPackage()

2
DataDino

現在のAndroid WebViewの実装とバージョンを取得するために、すべてのAPIレベルで有効なこのメソッドを作成しました。

@SuppressLint("PrivateApi")
@SuppressWarnings({"unchecked", "JavaReflectionInvocation"})
public @Nullable PackageInfo getCurrentWebViewPackageInfo() {
    PackageInfo pInfo = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        //starting with Android O (API 26) they added a new method specific for this
        pInfo = WebView.getCurrentWebViewPackage();
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        //with Android Lollipop (API 21) they started to update the WebView 
        //as a separate APK with the PlayStore and they added the
        //getLoadedPackageInfo() method to the WebViewFactory class and this
        //should handle the Android 7.0 behaviour changes too
        try {
            Class webViewFactory = Class.forName("Android.webkit.WebViewFactory");
            Method method = webViewFactory.getMethod("getLoadedPackageInfo");
            pInfo = (PackageInfo) method.invoke(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        //before Lollipop the WebView was bundled with the
        //OS, the fixed versions can be found online, for example:
        //Android 4.4 has WebView version 30.0.0.0
        //Android 4.4.3 has WebView version 33.0.0.0
        //etc...
    }
    return pInfo;
}

次に、結果を評価できます

if (pInfo != null) {
    Log.d("WEBVIEW VERSION", pInfo.packageName + ", " + pInfo.versionName);
}

注意:WebViewのアプリの更新直後に、次のようにクラッシュが発生する可能性があります: https://stackoverflow.com/a/29809338/291052 現時点では、この行はwebViewFactory.getMethod("getLoadedPackageInfo")上記のコードのはnullを返します。実際には、これを防ぐためにできることは何もありません(WebViewの実装がChromeアプリから取得されたが、確認されていない場合、これは発生しないはずです)。

3
MatPag

DataDinoの回答 の補足情報として、26未満のAPIの場合、目的の出力を提供するコードのチャンクを次に示します。


    Class webViewFactory = Class.forName("Android.webkit.WebViewFactory");
    Method method = webViewFactory.getMethod("getLoadedPackageInfo");
    PackageInfo packageInfo = (PackageInfo) method.invoke(null, null);

    if ("com.Android.webview".equals(packageInfo.packageName)) {
        // "Android System WebView" is selected
    } else {
        // something else selected
        // in case of chrome it would be "com.Android.chrome"
    }
2
azizbekian

AppCompatバージョンがあります:

WebViewCompat.getCurrentWebViewPackage(context)

0
tonyo.dev