我正在构建一个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
。
这是正确的方法吗?
答案 0 :(得分:12)
要更改用户代理,您需要使用HTTP请求发送自定义User-Agent:标头。假设您使用的是Android org.apache.http.client.HttpClient类,则有两种选择:
HttpGet get = new HttpGet(url); get.setHeader("User-Agent", myUserAgent);
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();
。
如果要在后台线程中访问用户代理。使用
System.getProperty("http.agent")
要检查用户代理是否有效,请使用此https://deviceatlas.com/device-data/user-agent-tester