Универсальный пользовательский агент Android (UA) - PullRequest
11 голосов
/ 15 апреля 2011

Я создаю приложение для 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</p> <p>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.

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

Ответы [ 5 ]

12 голосов
/ 15 апреля 2011

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

  1. Установить заголовок пользовательского агента для каждого запроса.Это можно сделать, вызвав setHeader () объекта HttpRequest (HttpPost, HttpGet и т. Д.) После его создания:
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 и т. Д.), Вы устанавливаете пользовательский агент.Измененный пользовательский агент будет сохраняться до тех пор, пока существует этот экземпляр WebView, поэтому вы должны сделать это в onCreate () вашего Activity:

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

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

1 голос
/ 12 января 2012

Вы можете сделать это в полной мере, и на 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();
}

Если вы хотите автоматически увеличить номер сборки, иначе.versionCode, вы также можете взглянуть на этот другой пост Переполнение стека , решение C #.

После этого вы просто меняете 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]
1 голос
/ 15 апреля 2011

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

0 голосов
/ 30 мая 2018

Когда вы используете веб-представление для доступа к агенту пользователя, убедитесь, что вы запускаете

new WebView(this).getSettings().getUserAgentString();

в потоке пользовательского интерфейса.

Если вы хотитедля доступа к пользовательскому агенту в фоновом потоке.используйте

System.getProperty("http.agent")

Чтобы проверить, действителен ли пользовательский агент или нет, используйте этот https://deviceatlas.com/device-data/user-agent-tester

0 голосов
/ 15 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...