Android Generic User Agent (UA)
Я создаю приложение для Android для отображения контента с сервера. Сервер представляет собой мобильный веб-сайт (например,http://m.google.com) который отслеживает трафик от различных мобильных клиентов. Чтобы дифференцировать клиент Android, как предоставить общую строку для моего приложения?
вот почему я прошу:
некоторые Android устройств у меня есть УА строк типа:
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; ru-us; Eclair_spr Build / 30201) AppleWebKit / 520.17 (KHTML, like Gecko) версия / 4.0 мобильное сафари/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
.
это правильный способ сделать это?
5 ответов
чтобы изменить пользовательский агент, вам нужно отправить пользовательский заголовок User-Agent: с вашим HTTP-запросом. Предполагая, что вы используете Android org.апаш.http.клиент.Класс HttpClient, у вас есть два варианта:
- установите заголовок агента пользователя для каждого запроса. Вы делаете это, вызывая setHeader () на объекте HttpRequest (HttpPost, HttpGet, whatever) после его создания:
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);
Если вы хотите добавить вместо замены агента пользователя, вы можете сначала прочитать существующий, изменить его и установить его обратно с помощью любого из вышеуказанных методов.
EDIT:
поскольку вы сказали, что используете представление WebView, вам нужно будет использовать настройку WebSettings момент не существует. Это один и тот же процесс. Перед вызовом метода load () (loadUrl, loadData и т. д.) Вы устанавливаете агент пользователя. Измененный пользовательский агент будет сохраняться до тех пор, пока этот экземпляр WebView находится рядом, поэтому вы сделаете это в onCreate() вашей активности:
view = (WebView)findViewById(R.id.webview); view.getSettings().setUserAgentString(myUserAgent);
опять же, если вы хотите добавить вместо замены, используйте getUserAgentString (), чтобы прочитать его, затем обновите его и снова установите.
поскольку вы управляете своим клиентом Android, почему бы вам не создать общую строку заголовка и не установить ее в заголовке каждый раз, когда ваше приложение делает вызов сервера? Таким образом, вы можете убедиться, что строка уникальна, а также добавить любую другую полезную информацию для отправки на сервер. Вы должны иметь возможность использовать webView.loadUrl()
для установки дополнительных заголовков.
вы можете полностью сделать это и на developer.android.com предложите это также, когда они говорят о WebView, особенно если вы хотите создать веб-приложение для своего веб-представления. Ссылка здесь: http://developer.android.com/guide/webapps/webview.html
Id предлагает не только сохранить ссылку на приложение в вашем агенте пользователя, но и отслеживать версию.
в любом случае, я хотел бы изменить свой 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 вы можете взглянуть на этот другой Переполнение Стека сообщение, а также решение C#.
после этого вы просто измените пользовательский агент.
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
}
или вы можете сразу обнаружить его от .реврайт:
RewriteCond %{HTTP_USER_AGENT} ^.*MyFancyAPPName.*$
RewriteRule ^(.*)$ http://www.MyWebSite/MyFancyAPPName [R=301]
Это зависит от того, какие рамки вы используете, чтобы сделать ваши запросы. Если вы используете org.apache
классы, вы можете позвонить setHeader('User-Agent', "Generic user agent here")
на HttpMessage
вы используете для выполнения вашего запроса.
когда вы используете веб-представление для доступа к User-agent, убедитесь, что вы запустили
new WebView(this).getSettings().getUserAgentString();
в потоке пользовательского интерфейса.
Если вы хотите получить доступ к агенту пользователя в фоновом потоке. использовать
System.getProperty("http.agent")
чтобы проверить, является ли пользовательский агент допустимым или нет, используйте этоhttps://deviceatlas.com/device-data/user-agent-tester