Pregunta

¿Hay una manera de recuperar agente de usuario del navegador sin tener un WebView en la actividad?

Yo sé que es posible conseguirlo a través de WebView:

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

Pero en mi caso no tengo / necesitará un objeto en vista web y no desea crear sólo para recuperar la cadena de agente de usuario.

¿Fue útil?

Solución

Si no lo hace Tienes uno puede intentar tomarlo como esto

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

Editar -

El documento de getUserAgentString() dice

Vuelta cadena de agente de usuario de la vista Web .

Así que no creo que se puede conseguir a menos que se declare una. Alguien me corrija si estoy equivocado

Otros consejos

Hay una manera mucho más simple si usted está en Android 2.1 o superior. Concedió esto no es exactamente la misma cadena de agente de usuario que un WebView volvería, pero podría servir bien suficiente para sus propósitos.

Como una ventaja adicional para tirar de la vista web, usted puede utilizar esto desde cualquier hilo (no sólo el hilo de interfaz de usuario).

Hay una propiedad del sistema llamada http.agent, que se puede utilizar para recuperar la cadena de agente de usuario.

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

programación get User-Agent cadena para obtener más detalles.

Solía ??usar solución href="https://stackoverflow.com/questions/3626071/retrieve-user-agent-programatically/3626156#3626156"> propuesto por DeRagan. Pero resultó que la creación de una única instancia WebView inicia un hilo "WebViewCoreThread", que permanece en el fondo hasta que la aplicación se termina por el sistema. Tal vez no consume demasiados recursos, pero eso no me gusta de todos modos. Así que utilizo método ligeramente diferente ahora, que trata de evitar la creación 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);
  }
}

Crea ejemplo WebSettings directamente utilizando el constructor paquete visible y si eso no está disponible por alguna razón (por ejemplo, debido a cambios en la API en futuras versiones de Android) -. Silencio cae de nuevo a "WebView-como" solución

Actualizar

Como se ha señalado por @ Skywalker5446 , a partir de Android 4.2 / API 17 , hay un método estático público para obtener el valor de agente de usuario por defecto. He actualizado mi código para utilizar ese método en las plataformas compatibles.

Dado que Android 2.1 se debe utilizar System.getProperty ( "http.agent");

También no necesita crear un WebView primero, y esa es la ventaja, se puede usar dentro de un no-uithread.

saludos Steve

Gracias a la respuesta de Idolon mi aplicación podría procesar esta en el fondo.

Pero de alguna manera en HTC Inspire 4G de AT & T que se ejecuta 2.3.3, se va a la sentencia catch y se puede ya no se ejecuta en el subproceso en segundo plano. Mi solución para esto es la siguiente:

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;
    }
}

(supongamos que tiene mContext y mUserAgent en el campo)

Se trata de una solución actualizada sobre la base de las respuestas anteriores que funciona cuando se compila para KitKat. Ahora la clase WebSettings es abstracto y la clase WebSettingsClassic se ha eliminado.

@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();
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top