2011-04-14 4 views
10

Je construis une application Android pour afficher le flux de contenu à partir d'un serveur. Le serveur est un site Web mobile (comme http://m.google.com) qui suit le trafic de divers clients mobiles. Pour différencier un client Android, comment puis-je fournir une chaîne générique pour mon application?Android Agent générique utilisateur (UA)

Voici pourquoi je demande que:

Certains des appareils Android je suis arrivé avoir des chaînes UA comme:

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

je dois ajouter une chaîne à la chaîne UserAgent pour identifier mon application. Par exemple:

Je dois faire quelque chose comme ceci: 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.

Est-ce la bonne façon de le faire?

Répondre

12

Pour modifier l'agent utilisateur, vous devez envoyer un en-tête User-Agent: personnalisé avec votre requête HTTP. En supposant que vous utilisez la classe Android org.apache.http.client.HttpClient, vous avez deux options:

  1. Définissez l'en-tête de l'agent utilisateur sur chaque requête. Vous faites cela en appelant setHeader() sur votre HttpRequest (HttpPost, HttpGet, peu importe) objet après sa création:
 
HttpGet get = new HttpGet(url); 
get.setHeader("User-Agent", myUserAgent); 
  1. Modifier le paramètre Agent utilisateur par défaut, qui affectera toutes les instances futures de cette classe HttpClient. Vous faites cela en lisant la collection HttpParams de votre client avec getParams() puis mettre à jour l'agent utilisateur à l'aide setParameter():
 
DefaultHttpClient http = new DefaultHttpClient(); 
http.getParams().setParameter(CoreProtocolPNames.USER_AGENT, myUserAgent); 

Si vous voulez ajouter au lieu de remplacer l'agent utilisateur, vous pouvez lire la existant en premier, changez-le, et réglez-le en utilisant l'une des méthodes ci-dessus.

EDIT:

Puisque vous avez dit que vous utilisez la WebView vue que vous aurez besoin d'utiliser le point de personnalisation de WebSettings là. C'est fondamentalement le même processus. Avant d'appeler la méthode load() (loadUrl, loadData, etc.), vous définissez l'agent utilisateur. L'agent utilisateur a changé persistera aussi longtemps que cette instance de l'WebView est autour, donc vous devriez le faire dans le onCreate() de votre activité:

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

Encore une fois, si vous voulez ajouter au lieu de remplacer , utilisez getUserAgentString() pour le lire, puis mettez-le à jour et rétablissez-le.

+0

merci Michael, ça a marché pour moi! –

0

Cela dépend du framework que vous utilisez pour faire vos demandes. Si vous utilisez les classes org.apache, vous pouvez appeler le setHeader('User-Agent', "Generic user agent here") sur le HttpMessage que vous utilisez pour faire votre demande.

+0

merci pour l'info. En fait, je ne fais pas de requête Http. J'ai un WebView dans lequel je rends le contenu HTML donc je fais juste webView.loadURL() Donc, tout ce que je peux faire est webView.getSettings().setUserAgentString() Un aperçu? –

+0

Vous avez la réponse là-bas ... pourquoi setUserAgentString() ne fonctionne pas pour vous? Obtenez la valeur actuelle avec getUserAgentString(), puis ajoutez votre valeur. Avez-vous essayé et constaté que cela ne fonctionne pas? –

+0

Merci pour l'info utile. oui, j'ai essayé la même approche que vous avez suggérée mais je me demandais si c'était la bonne façon de faire. Depuis, la chaîne myappname sera une chaîne alien au navigateur et elle ne devrait pas aboutir à un comportement indéfini. Néanmoins, cela fonctionne bien! Merci! –

1

Puisque vous contrôlez votre client Android, pourquoi ne créez-vous pas une chaîne d'en-tête générique et la définissez-vous dans l'en-tête chaque fois que votre application appelle un serveur? De cette façon, vous pouvez vous assurer que la chaîne est unique, et peut également ajouter toute autre information utile à envoyer au serveur. Vous devriez pouvoir utiliser webView.loadUrl() pour définir des en-têtes supplémentaires.

+0

thaks omermuhammed pour votre info! –

1

Vous pouvez totalement faire cela et à developer.android.com le suggère aussi, quand ils parlent de WebView, surtout si vous voulez construire une application web pour votre vue web. Référence ici: http://developer.android.com/guide/webapps/webview.html

Id suggérer non seulement de garder une référence à l'application dans votre agent utilisateur, mais aussi de garder une trace de la version.

De toute façon, je cherchais à changer mon UA ​​aussi et les discussions ici et m'a encouragé à le faire aussi bien.

Voici mon implémentation:

Sur votre Android APP:

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

Si vous voulez augmenter automatiquement le numéro de build aka. versionCode vous pouvez jeter un oeil à cet autre poste Stack Overflow, la solution C#.

Ensuite, il vous suffit de modifier l'agent utilisateur.

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

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

Sur votre application Web: En PHP

<?php 
$ua = strtolower($_SERVER['HTTP_USER_AGENT']); 

if(stripos($ua,'MyFancyAPPName') !== false){ 
    //do whatever you wish here 
} 
?> 

Ou en JavaScript

var ua = navigator.userAgent.toLowerCase(); 
var isAndroid = ua.indexOf("MyFancyAPPName") > -1; 
if(isAndroid) { 
    //do whatever you wish here 
} 

Ou vous pouvez directement détecter à partir du fichier .htaccess:

RewriteCond %{HTTP_USER_AGENT} ^.*MyFancyAPPName.*$ 
RewriteRule ^(.*)$ http://www.MyWebSite/MyFancyAPPName [R=301] 
Questions connexes