J'avais l'habitude d'utiliser solution proposé par DeRagan. Mais il s'est avéré que la création d'une seule instance WebView
démarre un thread "WebViewCoreThread" qui reste en arrière-plan jusqu'à ce que l'application soit terminée par le système. Peut-être que ça ne consomme pas trop de ressources mais je ne l'aime pas quand même. Donc, j'utilise méthode légèrement différente maintenant, qui tente d'éviter la création 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);
}
}
Il crée WebSettings
exemple constructeur directement à l'aide du package visible et si ce n'est pas disponible pour une raison quelconque (par exemple, en raison de modifications de l'API dans le futur Android versions) - revient silencieusement à la solution "WebView-like".
MISE À JOUR
Comme indiqué par @Skywalker5446, à partir de Android 4.2/API 17, il existe une méthode statique publique pour obtenir la valeur de l'agent utilisateur par défaut. J'ai mis à jour mon code pour utiliser cette méthode sur les plates-formes prises en charge.
Merci, cela fonctionne. Serait bien de le contourner sans créer d'objet, mais il semble que ce n'est pas vraiment possible ... – Laimoncijus