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, у вас есть два варианта:

  1. установите заголовок агента пользователя для каждого запроса. Вы делаете это, вызывая setHeader () на объекте HttpRequest (HttpPost, HttpGet, whatever) после его создания:
HttpGet get = new HttpGet(url);
get.setHeader("User-Agent", myUserAgent);
  1. измените параметр агента пользователя по умолчанию, который повлияет на все будущее экземпляры этого класса 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