Общий пользовательский агент Android (UA)

Я создаю приложение Android для отображения фида контента с сервера. Сервер - это мобильный сайт (например 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.

Это правильный способ сделать это?

Ответ 1

Чтобы изменить агент пользователя, вам необходимо отправить пользовательский заголовок User-Agent: с вашим HTTP-запросом. Предполагая, что вы используете класс Android org.apache.http.client.HttpClient, у вас есть два варианта:

  • Задайте заголовок пользовательского агента для каждого запроса. Вы делаете это, вызывая setHeader() на свой объект HttpRequest (HttpPost, HttpGet, любой) после его создания:
HttpGet get = new HttpGet(url);
get.setHeader("User-Agent", myUserAgent);
  1. Измените параметр User Agent по умолчанию, который повлияет на все будущие экземпляры этого класса HttpClient. Вы делаете это, читая коллекцию HttpParams от своего клиента с помощью getParams(), а затем обновляя агент пользователя с помощью setParameter():
DefaultHttpClient http = new DefaultHttpClient(); 
http.getParams().setParameter(CoreProtocolPNames.USER_AGENT, myUserAgent);

Если вы хотите добавить вместо замены пользовательского агента, вы можете сначала прочитать его, изменить его и установить его с помощью любого из указанных выше методов.

EDIT:

Поскольку вы сказали, что используете представление WebView, вам нужно будет использовать точку настройки WebSettings. Это в основном тот же процесс. Прежде чем вы вызовете какой бы метод load() (loadUrl, loadData и т.д.), Вы устанавливаете агент пользователя. Измененный пользовательский агент будет сохраняться до тех пор, пока этот экземпляр WebView находится вокруг, поэтому вы должны сделать это в onCreate() вашей деятельности:

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

Опять же, если вы хотите добавить вместо замены, используйте getUserAgentString(), чтобы прочитать его, затем обновите и снова установите.

Ответ 2

Поскольку вы управляете своим клиентом Android, почему бы вам не создать общую строку заголовка и не устанавливать его в заголовке каждый раз, когда ваше приложение вызывает вызов сервера? Таким образом, вы можете гарантировать, что строка уникальна и может также добавить любую другую полезную информацию для отправки на сервер. Вы можете использовать webView.loadUrl() для установки дополнительных заголовков.

Ответ 3

Вы можете полностью это сделать, и на developer.android.com также предложите это, когда они расскажут о WebView, особенно если вы хотите создать веб-приложение для своего веб-представления. Ссылка здесь: http://developer.android.com/guide/webapps/webview.html

Id предлагает не только сохранить ссылку на приложение в вашем User Agent, но и отслеживать версию.

В любом случае, я искал изменить свой UA и обсуждения здесь, и это побудило меня сделать это.

Вот моя реализация:

На вашем Android-приложении:

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

Если вы хотите автоматически увеличить номер сборки aka. versionCode вы можете взглянуть на это другое Stack Overflow, а также на решение С#.

После этого вы просто меняете User Agent.

WebView mywebview = (WebView)findViewById(R.id.webView);
String myUserAgent = " MyFancyAPPName  V."+versionName+"."+versionCode;

mywebview.getSettings().setUserAgentString(mywebview.getSettings().getUserAgentString()+myUserAgent);

В вашем веб-приложении: в 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]

Ответ 4

Это зависит от того, какие рамки вы используете для выполнения своих запросов. Если вы используете классы org.apache, вы можете вызвать setHeader('User-Agent', "Generic user agent here") на HttpMessage, который вы используете для выполнения вашего запроса.