2011-04-14 65 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]