Android通用用户代理(UA)

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

这就是为什么我这样问:

我得到的一些Android设备有UAstring,如:

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,如Gecko)版本4.0 Mobile Safari / 520.17

我需要附加一个string到UserAgentstring来识别我的应用程序。 例如:

我需要做这样的事情: 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

这是正确的方法吗?

Solutions Collecting From Web of "Android通用用户代理(UA)"

要更改用户代理,您需要发送一个自定义User-Agent:标头与您的HTTP请求。 假设你正在使用Android org.apache.http.client.HttpClient类,你有两个select:

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

如果要附加而不是replace用户代理,可以先读取现有的用户代理,然后使用上述方法之一对其进行更改。

编辑:

既然你说你正在使用WebView视图,你将需要在那里使用WebSettings的定制点。 这基本上是一样的过程。 在你调用load()方法(loadUrl,loadData等)之前,你要设置用户代理。 更改后的用户代理将会一直存在,只要该WebView的实例处于该状态,那么您可以在Activity的onCreate()中执行此操作:

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

同样,如果你想追加而不是replace,可以使用getUserAgentString()来读取它,然后更新它并重新设置它。

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

你可以完全做到这一点,并在developer.android.combuild议,当他们谈论的WebView,特别是如果你想build立一个Web应用程序的Web视图。 参考这里: http : //developer.android.com/guide/webapps/webview.html

Idbuild议不仅要继续引用您的用户代理中的应用程序,还要跟踪版本。

无论如何,我也想改变我的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(); } 

如果你想自动增加内部版本号。 versionCode你也可以看看这个其他堆栈溢出post,以及C#解决scheme。

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

 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] 

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