Question

Y at-il un moyen de récupérer l'agent utilisateur du navigateur sans avoir WebView l'activité?

Je sais qu'il est possible d'obtenir via WebView:

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

Mais dans mon cas, je n'ai pas / besoin d'un objet WebView et je ne veux pas créer juste pour récupérer la chaîne de l'agent utilisateur.

Était-ce utile?

La solution

Si vous n'êtes pas Vous que vous pouvez essayer de prendre comme ça

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

Edition -

Le doc pour getUserAgentString() dit

Retour chaîne de l'agent utilisateur de la WebView .

Alors je ne pense pas que vous pouvez l'obtenir à moins que vous déclarez un. Quelqu'un me corrigera si je me trompe

Autres conseils

Il y a une façon beaucoup plus simple si vous êtes sur Android 2.1 ou supérieur. Accordé ce n'est pas la chaîne Agent exactement le même utilisateur qu'un WebView retournerait, mais pourrait vous servir assez bien à vos besoins.

Comme un avantage supplémentaire à tirer de la vue Web, vous pouvez l'utiliser de tout fil (pas seulement le thread d'interface utilisateur).

Il est une propriété de système appelé http.agent, qui peut être utilisé pour récupérer la chaîne User-Agent.

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

Voir get Programmatically User-Agent Chaîne pour plus détails.

Je l'habitude d'utiliser proposée par DeRagan. Mais il est apparu que la création d'une instance unique de WebView démarre un thread « WebViewCoreThread » qui reste sur le fond jusqu'à ce que l'application se termine par le système. Peut-être qu'il ne consomme pas trop de ressources, mais je ne l'aime pas de toute façon. Donc, j'utilise méthode légèrement différente maintenant, qui tente d'éviter la création 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);
  }
}

Il crée instance WebSettings directement à l'aide constructeur de package visible et si ce n'est pas disponible pour une raison quelconque (par exemple en raison de modifications de l'API dans l'avenir des versions Android) -. Tombe silencieusement à « WebView comme » solution

UPDATE

Comme indiqué par @ Skywalker5446 , à partir de Android 4.2 / API 17 , il existe une méthode de statique publique pour obtenir la valeur par défaut de l'agent utilisateur. J'ai mis à jour mon code pour utiliser cette méthode sur les plates-formes prises en charge.

Depuis Android 2.1, vous devez utiliser System.getProperty ( "http.agent");

Vous ne devez également créer un WebView premier ET, thats l'avantage, vous pouvez l'utiliser dans un non-uithread.

salutations steve

Merci à la réponse de Idolon mon application pourrait traiter ce en arrière-plan.

Mais en quelque sorte sur le HTC Inspire 4G d'AT & T qui fonctionne 2.3.3, il va à la déclaration de capture et il peut être plus courir sur le fil d'arrière-plan. Ma solution pour cela est la suivante:

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

(supposons que vous avez mContext et mUserAgent dans le domaine)

Ceci est une solution mise à jour en fonction des réponses précédentes qui fonctionne lorsque vous compilez pour KitKat. Maintenant, la classe WebSettings est abstraite et la classe WebSettingsClassic a été supprimée.

@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();
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top