Я использовал решение , предложенное ДеРаганом.Но оказалось, что создание одного экземпляра WebView
запускает поток "WebViewCoreThread", который остается в фоновом режиме до тех пор, пока приложение не будет завершено системой.Может быть, это не потребляет слишком много ресурсов, но мне все равно это не нравится.Поэтому сейчас я использую немного другой метод, который пытается избежать создания 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);
}
}
Он создает экземпляр WebSettings
напрямую, используя конструктор, видимый в пакете, и если он недоступен по какой-либо причине (например, из-за APIизменения в будущих версиях Android) - молча возвращается к решению, подобному WebView.
ОБНОВЛЕНИЕ
Как указано @ Skywalker5446 , начинаяиз Android 4.2 / API 17 существует общедоступный статический метод для получения значения пользовательского агента по умолчанию.Я обновил свой код для использования этого метода на поддерживаемых платформах.