11

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

这是正确的方法吗?

4

5 回答 5

11

要更改用户代理,您需要在 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() 来读取它,然后更新它并重新设置它。

于 2011-04-14T20:24:08.590 回答
1

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

于 2011-04-14T20:40:02.267 回答
1

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

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

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

这是我的实现:

在您的安卓应用程序上:

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]
于 2012-01-12T14:54:22.910 回答
1

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

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

在 UI 线程上。

如果要在后台线程中访问用户代理。采用

System.getProperty("http.agent")

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

于 2018-05-30T17:25:07.810 回答
0

这取决于您用来提出请求的框架。如果您正在使用这些org.apache课程,您可以调用您用来完成您的请求setHeader('User-Agent', "Generic user agent here")的课程。HttpMessage

于 2011-04-14T20:14:12.547 回答