Получить пользовательский агент программно программно

StackOverflow https://stackoverflow.com/questions/3626071

Вопрос

Есть ли способ получить пользовательский агент браузера без WebView В деятельности?

Я знаю, что можно получить через WebView:

WebView view = (WebView) findViewById(R.id.someview);
String ua = view.getSettings().getUserAgentString() ;

Но в моем случае у меня нет / нуждается в объекте WebView, и я не хочу создавать его только для получения строки пользователей-агента.

Это было полезно?

Решение

Если вы этого не сделаете имеют один ты можешь попробовать принимать это так

String ua=new WebView(this).getSettings().getUserAgentString();

Редактировать-

Док для getUserAgentString() говорит

Верните строку пользовательского агента WebView.

Так что я не думаю, что вы можете получить его, если вы не объявите его. Кто-то поправьте меня, если я не прав

Другие советы

Есть гораздо проще, если вы находитесь на Android 2.1 или выше. Предоставлено, это не то же самое ни одно те же пользовательская строка агента, которые вернутся веб-просмотр, но может служить вам достаточно хорошо для ваших целей.

В качестве дополнительного преимущества для вытягивания с веб-представления вы можете использовать это из любой нити (не просто нить пользовательского интерфейса).

Существует системное свойство под названием http.Agent, который можно использовать для получения строки пользовательского агента.

String userAgent = System.getProperty("http.agent");

Видеть Программно получить строку пользовательского агента Больше подробностей.

Я использовал для использования решение Предлагается 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-Alude».

ОБНОВИТЬ

Как указано @ Skywalker5446., Начиная с Android 4.2 / API 17, имеется общественный статический метод для получения значения пользовательского агента по умолчанию. Я обновил свой код, чтобы использовать этот метод на поддерживаемых платформах.

С Android 2.1 вы должны использовать System.getProperty («http.Agent»);

Вы также не должны сначала создавать веб-просмотр сначала и, вот в пользу, вы можете использовать его внутри не-UITHREAD.

Приветствующие Стив

Благодаря ответу Идолона мое приложение может обработать это на заднем плане.

Но каким-то образом на HTC Inspire 4G от AT & T работает 2.3.3, он идет в оператор CATH, и его больше не может работать на фоновом потоке. Мое решение для этого следующее:

public static String getUserAgent(Context 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) {
        String ua;
        if(Thread.currentThread().getName().equalsIgnoreCase("main")){
            WebView m_webview = new WebView(context);
            ua = m_webview.getSettings().getUserAgentString();
        }else{
            mContext = context;
            ((Activity) mContext).runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    WebView webview = new WebView(mContext);
                    mUserAgent = webview.getSettings().getUserAgentString();
                }

            });
            return mUserAgent;
        }
        return ua;
    }
}

(Предположим, у вас есть Mcontext и MuserAgent в поле)

Это обновленное решение, основанное на предыдущих ответах, которые работают при компиляции для Kitkat. Теперь WebSettings класс абстрактный и WebSettingsClassic класс был удален.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static String getUserAgent(final Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return WebSettings.getDefaultUserAgent(context);
    }
    else {
        try {
            final Class<?> webSettingsClassicClass = Class.forName("android.webkit.WebSettingsClassic");
            final Constructor<?> constructor = webSettingsClassicClass.getDeclaredConstructor(Context.class, Class.forName("android.webkit.WebViewClassic"));
            constructor.setAccessible(true);
            final Method method = webSettingsClassicClass.getMethod("getUserAgentString");
            return (String) method.invoke(constructor.newInstance(context, null));
        }
        catch (final Exception e) {
            return new WebView(context).getSettings()
                    .getUserAgentString();
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top