【问题标题】:Android Generic User Agent (UA)Android 通用用户代理 (UA)
【发布时间】:2025-12-14 02:35:01
【问题描述】:

我正在构建一个 Android 应用程序来显示来自服务器的内容提要。服务器是一个移动网站(如http://m.google.com),它跟踪来自各种移动客户端的流量。为了区分 Android 客户端,如何为我的应用提供通用字符串?

这就是我问这个的原因:

我得到的一些 Android 设备有 UA 字符串,例如:

Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; ADR6400L 4G Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.1; en-us; Eclair_SPR Build/30201) AppleWebKit/520.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/520.17

我需要在 UserAgent 字符串中附加一个字符串来标识我的应用程序。例如:

我需要做这样的事情: Mozilla/5.0 (Linux; U; Android 2.1; en-us; Eclair_SPR Build/30201) AppleWebKit/520.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/520.17 Android_MyFirstApp

这是正确的方法吗?

【问题讨论】:

    标签: android generics agent


    【解决方案1】:

    要更改用户代理,您需要在 HTTP 请求中发送自定义 User-Agent: 标头。假设您使用的是 Android org.apache.http.client.HttpClient 类,您有两种选择:

    1. 为每个请求设置用户代理标头。您可以在创建 HttpRequest(HttpPost、HttpGet 等)对象后调用 setHeader():
    HttpGet 获取 = 新的 HttpGet(url); get.setHeader("用户代理", myUserAgent);
    1. 更改默认用户代理参数,这将影响该 HttpClient 类的所有未来实例。为此,您可以使用 getParams() 从客户端读取 HttpParams 集合,然后使用 setParameter() 更新用户代理:
    DefaultHttpClient http = new DefaultHttpClient(); http.getParams().setParameter(CoreProtocolPNames.USER_AGENT, myUserAgent);

    如果您想追加而不是替换用户代理,您可以先读取现有的,更改它,然后使用上述任一方法将其重新设置。

    编辑:

    既然您说您使用的是 WebView 视图,您将需要在那里使用 WebSettings 自定义点。这基本上是相同的过程。在调用任何 load() 方法(loadUrl、loadData 等)之前,您确实设置了用户代理。只要 WebView 的实例存在,更改的用户代理就会持续存在,因此您可以在 Activity 的 onCreate() 中执行此操作:

    视图 = (WebView)findViewById(R.id.webview); view.getSettings().setUserAgentString(myUserAgent);

    同样,如果您想追加而不是替换,请使用 getUserAgentString() 读取它,然后更新它并重新设置它。

    【讨论】:

      【解决方案2】:

      既然你控制着你的 Android 客户端,为什么不创建一个通用的标头字符串,并在你的应用每次调用服务器时将其设置在标头中?这样,您可以确保字符串是唯一的,并且还可以添加任何其他有用的信息以发送到服务器。您应该可以使用webView.loadUrl() 设置额外的标题。

      【讨论】:

      • 感谢 omermuhammed 提供您的信息!
      【解决方案3】:

      您完全可以做到这一点,并且在 developer.android.com 上也建议这样做,当他们谈论 WebView 时,特别是如果您想为您的 Web 视图构建一个 Web 应用程序。参考这里:http://developer.android.com/guide/webapps/webview.html

      我建议不仅要在您的用户代理中保留对应用程序的引用,还要跟踪版本。

      无论如何,我也想改变我的 UA,这里的讨论和鼓励我也这样做。

      这是我的实现:

      在您的 Android 应用上:

      String versionName="";
      int versionCode=0;
      try {
          versionName = getBaseContext().getPackageManager().getPackageInfo(getBaseContext().getPackageName(), 0 ).versionName;
          versionCode = getBaseContext().getPackageManager().getPackageInfo(getBaseContext().getPackageName(), 0 ).versionCode;
      } catch (NameNotFoundException e) {
          e.printStackTrace();
      }
      

      如果您想自动增加内部版本号。 versionCode,您也可以查看其他 Stack Overflow 帖子,即 C# 解决方案。

      之后您只需更改用户代理。

      WebView mywebview = (WebView)findViewById(R.id.webView);
      String myUserAgent = " MyFancyAPPName  V."+versionName+"."+versionCode;
      
      mywebview.getSettings().setUserAgentString(mywebview.getSettings().getUserAgentString()+myUserAgent);
      

      在您的 Web 应用程序中:在 PHP 中

      <?php
      $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
      
      if(stripos($ua,'MyFancyAPPName') !== false){
          //do whatever you wish here
      }
      ?>
      

      或在 JavaScript 中

      var ua = navigator.userAgent.toLowerCase();
      var isAndroid = ua.indexOf("MyFancyAPPName") > -1;
      if(isAndroid) { 
          //do whatever you wish here
      }
      

      或者直接从.htaccess文件中检测:

      RewriteCond %{HTTP_USER_AGENT} ^.*MyFancyAPPName.*$
      RewriteRule ^(.*)$ http://www.MyWebSite/MyFancyAPPName [R=301]
      

      【讨论】:

        【解决方案4】:

        当您使用 web 视图访问用户代理时,请确保您运行

        new WebView(this).getSettings().getUserAgentString();

        在 UI 线程上。

        如果你想在后台线程中访问用户代理。使用

        System.getProperty("http.agent")

        要检查用户代理是否有效,请使用https://deviceatlas.com/device-data/user-agent-tester

        【讨论】:

          【解决方案5】:

          这取决于您用于提出请求的框架。如果您使用的是 org.apache 类,则可以在用于执行请求的 HttpMessage 上调用 setHeader('User-Agent', "Generic user agent here")

          【讨论】:

          • 感谢您的信息。实际上,我不做 Http 请求。我有一个 WebView,我在其中呈现 HTML 内容,所以我只做 webView.loadURL() 所以,我所能做的就是 webView.getSettings().setUserAgentString()有什么见解吗?
          • 你有答案......为什么 setUserAgentString() 不适合你?使用 getUserAgentString() 获取当前值,然后附加您的值。你试过这个发现不行吗?
          • 感谢您提供的有用信息。是的,我尝试了您建议的相同方法,但我想知道这是否是正确的方法。因为,myappname 字符串对于浏览器来说将是一个外来字符串,它不应该导致未定义的行为。尽管如此,它工作正常!谢谢!
          • 您可以发布您的上述评论作为答案,以便我对其进行投票。谢谢!