Раньше я использовал solution, предложенный DeRagan. Но оказалось, что создание единственного экземпляра 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-like».
UPDATE
Как указано на @Skywalker5446, начиная с Android 4.2/API 17, есть общественный статический метод, чтобы получить значение агента пользователя по умолчанию. Я обновил свой код, чтобы использовать этот метод на поддерживаемых платформах.
Спасибо, это работает. Было бы неплохо обойти это без создания объекта, но кажется, что это действительно невозможно ... – Laimoncijus