Общий пользовательский агент 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);
- Измените параметр 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
, который вы используете для выполнения вашего запроса.