swith overrider chrome android webview android-webview user-agent

android - overrider - Recuperar User-Agent mediante programación



user agent swith (6)

¿Hay alguna manera de recuperar el user-agent del navegador sin tener una WebView en actividad?

Sé que es posible obtenerlo a través de WebView :

WebView view = (WebView) findViewById(R.id.someview); String ua = view.getSettings().getUserAgentString() ;

Pero en mi caso no tengo / necesito un objeto webview y no quiero crearlo solo para recuperar la cadena user-agent.


Si no tienes uno, puedes intentar tomarlo así

String ua=new WebView(this).getSettings().getUserAgentString();

Editar-

El documento para getUserAgentString() dice

Devuelve la cadena de agente de usuario de WebView .

Así que no creo que puedas obtenerlo a menos que declares uno. Alguien me corrige si estoy equivocado


Gracias a la respuesta de Idolon, mi aplicación podría procesar esto en segundo plano.

Pero de alguna manera en HTC Inspire 4G de AT & T que ejecuta 2.3.3, va a la declaración catch y ya no se puede ejecutar en el hilo de fondo. Mi solución para esto es la siguiente:

public static String getUserAgent(Context context) { try { Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class); constructor.setAccessible(true); try { WebSettings settings = constructor.newInstance(context, null); return settings.getUserAgentString(); } finally { constructor.setAccessible(false); } } catch (Exception e) { String ua; if(Thread.currentThread().getName().equalsIgnoreCase("main")){ WebView m_webview = new WebView(context); ua = m_webview.getSettings().getUserAgentString(); }else{ mContext = context; ((Activity) mContext).runOnUiThread(new Runnable() { @Override public void run() { WebView webview = new WebView(mContext); mUserAgent = webview.getSettings().getUserAgentString(); } }); return mUserAgent; } return ua; } }

(supongamos que tiene mContext y mUserAgent en el campo)


Esta es una solución actualizada basada en respuestas anteriores que funciona cuando compila para KitKat. Ahora la clase WebSettings es abstracta y la clase WebSettingsClassic se ha eliminado.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public static String getUserAgent(final Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { return WebSettings.getDefaultUserAgent(context); } else { try { final Class<?> webSettingsClassicClass = Class.forName("android.webkit.WebSettingsClassic"); final Constructor<?> constructor = webSettingsClassicClass.getDeclaredConstructor(Context.class, Class.forName("android.webkit.WebViewClassic")); constructor.setAccessible(true); final Method method = webSettingsClassicClass.getMethod("getUserAgentString"); return (String) method.invoke(constructor.newInstance(context, null)); } catch (final Exception e) { return new WebView(context).getSettings() .getUserAgentString(); } } }


Hay una manera mucho más simple si tienes Android 2.1 o superior. De acuerdo, esta no es exactamente la misma cadena de agente de usuario que devolvería una vista web, pero podría servirle lo suficientemente bien para sus propósitos.

Como una ventaja adicional para tirar de la vista web, puede usar esto desde cualquier subproceso (no solo el subproceso de interfaz de usuario).

Hay una propiedad del sistema llamada http.agent, que se puede usar para recuperar la cadena User-Agent.

String userAgent = System.getProperty("http.agent");

Consulte Obtener secuencia de usuario-agente mediante programación para obtener más detalles.


Desde Android 2.1 debes usar System.getProperty ("http.agent");

Tampoco es necesario que cree una vista web primero Y, esa es la ventaja, puede usarla dentro de un no-Uithread.

saludos steve


Solía ​​usar la solución propuesta por DeRagan. Pero resultó que la creación de una sola instancia de WebView inicia un hilo "WebViewCoreThread" que permanece en el fondo hasta que el sistema finaliza la aplicación. Tal vez no consume demasiados recursos pero no me gusta de todos modos. Entonces uso un método ligeramente diferente ahora, que trata de evitar la creación de WebViewCoreThread:

// You may uncomment next line if using Android Annotations library, otherwise just be sure to run it in on the UI thread // @UiThread public static String getDefaultUserAgentString(Context context) { if (Build.VERSION.SDK_INT >= 17) { return NewApiWrapper.getDefaultUserAgent(context); } try { Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class); constructor.setAccessible(true); try { WebSettings settings = constructor.newInstance(context, null); return settings.getUserAgentString(); } finally { constructor.setAccessible(false); } } catch (Exception e) { return new WebView(context).getSettings().getUserAgentString(); } } @TargetApi(17) static class NewApiWrapper { static String getDefaultUserAgent(Context context) { return WebSettings.getDefaultUserAgent(context); } }

Crea la instancia de WebSettings directamente usando el constructor visible del paquete y, si eso no está disponible por alguna razón (por ejemplo, debido a cambios de API en futuras versiones de Android), silenciosamente vuelve a la solución "similar a WebView".

ACTUALIZAR

Como señala @ Skywalker5446 , a partir de Android 4.2 / API 17, hay un método público estático para obtener el valor predeterminado del agente de usuario. He actualizado mi código para usar ese método en las plataformas compatibles.