2011-04-14 41 views
10

Estoy creando una aplicación de Android para mostrar el contenido de un servidor. El servidor es un sitio web móvil (como http://m.google.com) que rastrea el tráfico de varios clientes móviles. Para diferenciar un cliente de Android, ¿cómo proporciono una cadena genérica para mi aplicación?Agente de usuario genérico para Android (UA)

Aquí es por lo que pido que:

Algunos de los dispositivos Android que consiguió tener cadenas UA como:

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

tengo que añadir una cadena a la cadena de agente de usuario para identificar mi aplicación. Por ejemplo:

Tengo que hacer algo como esto: 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.

¿Es esta la forma correcta de hacerlo?

Respuesta

12

Para cambiar el agente de usuario, debe enviar un encabezado User-Agent personalizado con su solicitud HTTP. Suponiendo que está utilizando la clase Android org.apache.http.client.HttpClient, tiene dos opciones:

  1. Establezca el encabezado del agente de usuario en cada solicitud. Esto se hace llamando setHeader() en el objeto HttpRequest (HttpPost, HttpGet, lo que sea) después de crearlo:
 
HttpGet get = new HttpGet(url); 
get.setHeader("User-Agent", myUserAgent); 
  1. Cambiar el parámetro de agente de usuario por defecto, el cual afectará a todas las instancias futuras de esa clase HttpClient. Esto se hace mediante la lectura de la colección HttpParams de su cliente con getParams() y luego actualizar el agente de usuario utilizando setParameter():
 
DefaultHttpClient http = new DefaultHttpClient(); 
http.getParams().setParameter(CoreProtocolPNames.USER_AGENT, myUserAgent); 

Si desea añadir en lugar de reemplazar el agente de usuario, se puede leer la uno existente primero, cámbielo y configúrelo utilizando cualquiera de los métodos anteriores.

EDIT:

ya que dijo que está utilizando los WebView vista que tendrá que utilizar el punto WebSettings personalización allí. Básicamente es el mismo proceso. Antes de llamar a cualquier método load() (loadUrl, loadData, etc.) configura el agente de usuario. El agente de usuario cambiada persistirá siempre y cuando esa instancia de la vista Web es de alrededor, por lo que había de hacer esto en el onCreate() de su actividad:

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

De nuevo, si desea añadir en lugar de reemplazar , use getUserAgentString() para leerlo, luego actualícelo y vuelva a configurarlo.

+0

gracias Michael, funcionó para mí! –

0

Depende del marco que utilice para realizar sus solicitudes. Si está utilizando las clases org.apache, puede llamar al setHeader('User-Agent', "Generic user agent here") en el HttpMessage que utiliza para realizar su solicitud.

+0

gracias por la información. En realidad, no hago una solicitud de Http. Tengo un WebView en el que presento el contenido HTML, así que solo hago webView.loadURL() Entonces, todo lo que puedo hacer es webView.getSettings().setUserAgentString() ¿Alguna idea? –

+0

Tiene la respuesta allí ... ¿por qué no funciona setUserAgentString()? Obtenga el valor actual con getUserAgentString() y luego agregue su valor. ¿Has probado esto y descubrió que no funciona? –

+0

Gracias por la información útil. Sí, probé el mismo enfoque que sugirió, pero me preguntaba si esa es la forma correcta de hacerlo. Dado que, la cadena myappname será una cadena extraña para el navegador y no debe dar como resultado un comportamiento indefinido. Sin embargo, funciona bien! ¡Gracias! –

1

Dado que usted controla su cliente Android, ¿por qué no crea una cadena de encabezado genérico y lo establece en el encabezado cada vez que su aplicación hace una llamada al servidor? De esta forma, puede asegurarse de que la cadena sea única y también puede agregar cualquier otra información útil para enviar al servidor. Debería poder usar webView.loadUrl() para establecer encabezados adicionales.

+0

thaks omermuhammed para su información! –

1

Puede hacerlo completamente y en developer.android.También lo sugiero cuando hablan de WebView, especialmente si desea construir una aplicación web para su vista web. Referencia aquí: http://developer.android.com/guide/webapps/webview.html

Id sugiero no solo mantener la referencia en la aplicación en su agente de usuario, sino también realizar un seguimiento de la versión.

De todos modos, yo estaba buscando cambiar mi UA también y las discusiones aquí y la me animaron a hacerlo también.

Aquí es mi aplicación:

En su aplicación para 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(); 
} 

Si desea incremento automático del número de compilación aka. versionCode puedes echar un vistazo a esta otra publicación de Stack Overflow también, la solución C#.

Después, simplemente cambia el agente de usuario.

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

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

En su aplicación Web: En PHP

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

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

O En JavaScript

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

O se puede detectar directamente desde el archivo .htaccess :

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