Saltar al contenido

Determinar la implementación de WebView (Sistema WebView o Chrome)

Contamos con tu ayuda para compartir nuestras crónicas referente a las ciencias informáticas.

Solución:

Parece que esto ahora está disponible en Android O Preview:

Enlace: https://developer.android.com/preview/features/managing-webview.html

A partir de Android 7.0 (nivel de API 24), los usuarios pueden elegir entre varios paquetes diferentes para mostrar contenido web en un objeto WebView.
Android O incluye una API para obtener información relacionada con el paquete que muestra contenido web en su aplicación. Esta API es especialmente útil cuando se analizan errores que ocurren solo cuando su aplicación intenta mostrar contenido web usando la implementación de WebView de un paquete en particular.

Para usar esta API, agregue la lógica que se muestra en el siguiente fragmento de código:

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

WebView.getCurrentWebViewPackage Documentación: https://developer.android.com/reference/android/webkit/WebView.html#getCurrentWebViewPackage()

Para obtener el Android actual WebView implementación y versión He creado este método que debería ser válido para todos los niveles de 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;

Entonces puedes evaluar el resultado.

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

Recuerde: Inmediatamente después de una actualización de la aplicación de WebView, podría aparecer un bloqueo como se describe aquí: https://stackoverflow.com/a/29809338/2910520, en este momento, esta línea webViewFactory.getMethod("getLoadedPackageInfo") del código anterior devolvería null. En realidad, no hay nada que pueda hacer para evitar esto (esto no debería suceder si la implementación de WebView se toma de la aplicación Chrome pero no está confirmada).

Como información complementaria a la respuesta de DataDino, para las API inferiores a 26, aquí hay un fragmento de código que daría el resultado deseado:


    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"
    

valoraciones y comentarios

Nos puedes añadir valor a nuestro contenido informacional aportando tu experiencia en las anotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *