Android通用用户代理(UA)

时间:2011-04-14 20:08:03

标签: android generics agent

我正在构建一个Android应用,以显示来自服务器的内容Feed。该服务器是一个移动网站(如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

这是正确的方法吗?

5 个答案:

答案 0 :(得分:12)

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

  1. 在每个请求上设置用户代理标头。你可以在创建它之后通过调用HttpRequest(HttpPost,HttpGet,无论如何)对象上的setHeader()来执行此操作:
  2. HttpGet get = new HttpGet(url);
    get.setHeader("User-Agent", myUserAgent);
    
    1. 更改默认的User Agent参数,该参数将影响该HttpClient类的所有未来实例。您可以使用getParams()从客户端读取HttpParams集合,然后使用setParameter()更新用户代理:
    2. DefaultHttpClient http = new DefaultHttpClient(); 
      http.getParams().setParameter(CoreProtocolPNames.USER_AGENT, myUserAgent);
      

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

      编辑:

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

我建议您不仅要在用户代理中继续引用该应用程序,还要跟踪版本。

无论如何,我也想改变我的UA以及此处的讨论,并鼓励我这样做。

这是我的实施:

在您的Android APP上:

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

如果您想要自动增加内部版本号。你还可以看看这个其他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]

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

UI线程上的

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

System.getProperty("http.agent")

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