2011-04-14 67 views
10

我正在构建一个Android应用程序以显示来自服务器的内容馈送。该服务器是一个移动网站(如http://m.google.com),用于跟踪来自各种移动客户端的流量。要区分Android客户端,我该如何为我的应用程序提供一个通用字符串?Android通用用户代理(UA)

这也是为什么我问的是:

一些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

我需要一个字符串追加到用户代理字符串,以确定我的应用程序。例如:

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

这是正确的方法吗?

回答

12

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

  1. 在每个请求上设置用户代理标头。你可以通过你的HttpRequest(HttpPost,HTTPGET,等等)对象调用的setHeader()创建之后做到这一点:
 
HttpGet get = new HttpGet(url); 
get.setHeader("User-Agent", myUserAgent); 
  • 更改默认的用户代理参数,将影响该HttpClient类的所有未来实例。您可以通过从客户端读取的HttpParams收集与getParams()方法则使用的setParameter()更新用户代理做到这一点:
  •  
    DefaultHttpClient http = new DefaultHttpClient(); 
    http.getParams().setParameter(CoreProtocolPNames.USER_AGENT, myUserAgent); 
    

    如果要追加,而不是取代用户代理,你可以阅读先存在一个,然后使用上述任一方法将其更改并重新设置。

    编辑:

    既然你说你正在使用的WebView查看您需要有使用WebSettings定制点。这基本上是一样的过程。在你调用load()方法(loadUrl,loadData等)之前,你需要设置用户代理。再次

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

    ,如果要追加,而不是取代:更改用户代理将只要WebView中的该实例是围绕坚持,所以你应该这样做在OnCreate()你的活动,使用getUserAgentString()来读取它,然后更新它并重新设置它。

    +0

    感谢迈克尔,它为我工作! – 2011-04-14 22:13:25

    0

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

    +0

    感谢您的信息。其实,我不会做Http请求。我有一个WebView,我在其中呈现HTML内容,所以我只是做webView.loadURL()所以,我所能做的就是webView.getSettings().setUserAgentString()任何见解? – 2011-04-14 20:18:27

    +0

    你有答案在那里......为什么不是setUserAgentString()为你工作?使用getUserAgentString()获取当前值,然后附加值。你试过这个,发现它不起作用? – 2011-04-14 20:34:00

    +0

    感谢您的有用信息。是的,我尝试了与您建议的方法相同的方法,但我想知道这是否是正确的方法。因为myappname字符串是浏览器的一个外来字符串,它不应该导致未定义的行为。不过,它工作正常!谢谢! – 2011-04-14 22:12:39

    1

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

    +0

    thaks omermuhammed为您的信息! – 2011-04-14 22:13:08

    1

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

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

    无论如何,我期待着改变我的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,你也可以看看这个其他的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]