Solía usar solution propuesto por DeRagan. Pero resultó que la creación de una única 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. Así que utilizo método ligeramente diferente ahora, que trata de evitar la creación 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);
}
}
Se crea WebSettings
instancia directamente utilizando el constructor paquete visible y si eso no está disponible por alguna razón (por ejemplo, debido a cambios en la API en el futuro Android versiones): regresa silenciosamente a la solución "similar a WebView".
ACTUALIZACIÓN
Como se señaló por @Skywalker5446, a partir de Android 4.2/API 17, hay un método estático público para obtener el valor de agente de usuario por defecto. He actualizado mi código para usar ese método en las plataformas compatibles.
Gracias, funciona. Sería bueno sortearlo sin crear un objeto, pero parece que no es realmente posible ... – Laimoncijus