Android 通用用户代理 (UA)

标签 android generics agent

我正在构建一个 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

这是正确的做法吗?

最佳答案

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

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

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

编辑:

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

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

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

关于Android 通用用户代理 (UA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5669045/

相关文章:

java - OpenGL ES 渲染错误

typescript - 为什么 TypeScript 在实现泛型接口(interface)时无法推断出函数参数的类型?

swift - 带有泛型参数的复杂 Swift 闭包

c - 如何确定 netsnmp 代理的 IP 和 MAC 地址?

Android 注册一个文件以供下载

android - Firebase Cloud Messaging (FCM) - 当用户点击带有附加功能的通知时启动 Activity

c - 关于Android内核的几个问题

swift - 带有关联值的枚举 + 泛型 + 带有关联类型的协议(protocol)

java - [Azure][适用于 Java 的 Application Insights 代理]java.lang.NoClassDefFoundError : http/RequestLine

artificial-intelligence - 是否有任何不能或不能编译的解释代理语言?