Frage

Gibt es eine Möglichkeit Browser User-Agenten abrufen, ohne eine WebView in Aktivität?

Ich weiß, es möglich ist, es über WebView zu bekommen:

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

Aber in meinem Fall habe mich nicht / braucht ein Webansicht Objekt und ich will nicht, es zu erstellen, für die Beschaffung von String-User-Agenten.

War es hilfreich?

Lösung

Wenn Sie dies nicht tun Haben ein, können Sie versuchen es so nehmen

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

Bearbeiten -

Der Doc für getUserAgentString() sagt

Zurück der User-Agent-String des WebView .

So glaube nicht, dass ich Sie es bekommen können, wenn Sie ein erklären. Irgend jemand korrigiert mich wenn ich falsch liege

Andere Tipps

Es gibt eine viel einfachere Art und Weise, wenn Sie auf Android 2.1 oder höher sind. Zugegeben das ist nicht genau die gleiche User-Agent-String, der ein webview zurückkehren würde, aber könnten Sie gut genug für Ihre Zwecke dienen.

Als zusätzlicher Vorteil von Web-Ansicht ziehen, können Sie dies von jedem Thread verwenden (nicht nur der UI-Thread).

Es ist eine Systemeigenschaft genannt http.agent, die verwendet werden können, die User-Agent-String abzurufen.

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

Siehe Programmatically get User-Agent String mehr Details.

Ich benutzen Lösung von DeRagan vorgeschlagen zu verwenden. Aber es stellte sich heraus, dass eine einzelne WebView Instanz startet einen Thread „WebViewCoreThread“, die Aufenthalte auf dem Hintergrund bis zur Anwendung durch das System beendet wird. Vielleicht ist es nicht zu viel Ressourcen verbrauchen aber ich weiß nicht, wie es trotzdem. Also habe ich jetzt etwas andere Methode verwenden, die versucht WebViewCoreThread Schöpfung zu vermeiden:

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

Es schafft WebSettings Instanz direkt Paket sichtbaren Konstruktor und wenn das aus irgendeinem Grund nicht verfügbar ist (beispielsweise aufgrund von API-Änderungen in zukünftigen Android-Versionen.) - leise fällt zurück auf „WebView-like“ Lösung

UPDATE

Wie bereits von @ Skywalker5446 von Android starten 4.2 / API 17 gibt es eine öffentliche statische Methode Standard-User-Agent-Wert zu erhalten. Ich habe meinen Code aktualisiert diese Methode auf den unterstützten Plattformen.

Seit Android 2.1 sollten Sie verwenden System.getProperty ( "http.agent");

Sie müssen nicht auch Notwendigkeit, eine WebView zu schaffen erste AND, das ist der Vorteil, Sie es sich in einer nicht-uithread verwenden können.

Grüße steve

Dank Idolon Antwort meine app könnten diesen Prozess im Hintergrund.

Aber irgendwie auf HTC Inspire 4G von AT & T, die 2.3.3 läuft, geht es an die catch-Anweisung, und es kann nicht mehr auf dem Hintergrund-Thread ausgeführt werden. Meine Lösung hierfür ist die folgende:

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

(nehme an, Sie haben mContext und mUserAgent im Feld)

Dies ist eine aktualisierte Lösung auf früheren Antworten basieren, die funktioniert, wenn Sie für KitKat kompilieren. Nun ist die WebSettings Klasse ist abstrakt und die WebSettingsClassic Klasse entfernt wurde.

@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();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top