代码之家  ›  专栏  ›  技术社区  ›  Laimoncijus

以编程方式检索用户代理

  •  34
  • Laimoncijus  · 技术社区  · 14 年前

    WebView 在活动中?

    网络视图 :

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

    6 回复  |  直到 7 年前
        1
  •  58
  •   DeRagan    14 年前

    如果你不 你可以试着这样做

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

    你的医生 getUserAgentString()

    返回WebView的用户代理字符串

    所以我认为你不能得到它除非你申报一个。如果我错了,有人会纠正我

        2
  •  58
  •   Craig Russell    9 年前

    如果您使用的是Android2.1或更高版本,有一种更简单的方法。诚然,这与webview返回的用户代理字符串不完全相同,但可能足以满足您的需要。

    作为从web视图拉取的另一个优势,您可以从任何线程(不仅仅是UI线程)使用它。

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

    看到了吗 Programmatically get User-Agent String 更多细节。

        3
  •  37
  •   Community WizardZ    7 年前

    solution 由德拉根提出。但事实证明 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 实例直接使用包可见构造函数,如果由于某些原因(例如,由于未来Android版本的API更改)而无法使用,则会自动退回到“类似WebView”的解决方案。

    更新

    正如 @Skywalker5446 ,从android4.2/api17开始,有一个公共静态方法来获取默认的用户代理值。我已经更新了代码,以便在支持的平台上使用该方法。

        4
  •  10
  •   JacksOnF1re    8 年前

    因为android2.1你应该使用 系统.getProperty("http.agent");

    你也不需要先创建一个网络视图,这就是优势,

    你好,史蒂夫

        5
  •  1
  •   st_bk    10 年前

    但在运行2.3.3的AT&T公司HTC Inspire 4G上,它转到catch语句,不能再在后台线程上运行。 我的解决方案如下:

    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在现场)

        6
  •  1
  •   Monstieur    10 年前

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