Użyłem użyć solution zaproponowanego przez DeRagan. Okazało się jednak, że utworzenie pojedynczej instancji WebView
powoduje uruchomienie wątku "WebViewCoreThread", który pozostaje w tle do momentu zakończenia aplikacji przez system. Może nie zużywa zbyt wiele zasobów, ale i tak mi się to nie podoba. Więc używam nieco inną metodę teraz, który stara się uniknąć tworzenia 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);
}
}
tworzy WebSettings
instancji bezpośrednio za pomocą konstruktora pakiet widoczne, a jeśli to nie jest dostępne dla jakiegoś powodu (np z powodu zmian API w przyszłości Androida wersje) - po cichu wraca do rozwiązania "podobnego do WebView".
UPDATE
Jak wskazano przez @Skywalker5446, począwszy od Androida 4.2/17 API, jest publiczna metoda statyczna, aby uzyskać wartość domyślna agenta użytkownika. Zaktualizowałem swój kod, aby korzystać z tej metody na obsługiwanych platformach.
Dzięki, to działa. Byłoby miło obejść go bez tworzenia obiektu, ale wygląda na to, że nie jest to możliwe ... – Laimoncijus