Cómo modificar los encabezados de solicitudes HTTP desde una aplicación de Android?

¿Hay una manera para mí para capturar todas las solicitudes HTTP que se están enviando desde mi aplicación, y modificar sus encabezados antes de que se envían? Quiero modificar su encabezado referer para que el servidor que las solicitudes se envían a piensa como si vengan de un navegador web en lugar de una aplicación móvil. ¡Gracias!

Actualización: Para darle más contexto, estoy planeando portar una extensión de cromo de música instantánea a una aplicación de Android mediante Phonegap. Algunos videos de YouTube que se permiten en la PC no se permiten en los móviles y sospecho que es porque el reproductor de youtube incrustado dentro de una aplicación de Android no tiene un encabezado de referencia. Estoy tratando de encontrar una solución a este problema para que pueda reproducir esos videos en el móvil también.

Youtube detecta la Agent String del navegador de usuario que contiene información sobre el navegador. Si tuviera que usar un WebView para mostrar el video de youtube en su lugar, entonces sería posible establecer esa Agent String WebView . Puede encontrar cadenas de agentes de diferentes navegadores en Internet. Encontré algunos aquí: Agent Strings .

Así es como toco la canción de Bob Marley que no se permite en los teléfonos móviles por suplantar a un navegador Firefox:

 package com.my.myapplication; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; public class MyActivity extends Activity { private WebView mWebView ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWebView = new WebView(this); // Enable javascript mWebView.getSettings().setJavaScriptEnabled(true); // Impersonate Mozzila browser mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0"); final Activity activity = this; mWebView.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, description, Toast.LENGTH_SHORT).show(); } }); mWebView .loadUrl("http://youtube.com/watch?v=x59kS2AOrGM"); setContentView(mWebView); } } 

EDITAR:

También necesitas dar permiso para que tu actividad utilice Internet, agregando esta línea a tu AndroidManifest.xml :

 <uses-permission android:name="android.permission.INTERNET" /> 

Exención de responsabilidad: Truco sucio, sólo probado en Android 4.4, pero debería funcionar para Android 4.0 y superior.

Los métodos setupURLStreamHandlerFactory () deben ser llamados tan pronto como sea posible y establece nuestro propio controlador de flujo de URL con URL.setURLStreamHandlerFactory() . La fábrica se utiliza para todas las conexiones abiertas mediante URL.openConnection() . Establecemos un controlador especial para todas las URL http: // … que establece el encabezado 'Referer' en la HttpUrlConnection creada.

 private static String REFERER_URL = "http://www.example.com/referer"; private void setupURLStreamHandlerFactory() { URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() { @Override public URLStreamHandler createURLStreamHandler(String protocol) { if ("http".equals(protocol)) { try { String className = Build.VERSION.SDK_INT < 19 ? "libcore.net.http.HttpHandler" : "com.android.okhttp.HttpHandler"; URLStreamHandler streamHandler = (URLStreamHandler) Class .forName(className).newInstance(); return wrap(streamHandler); } catch (Exception e) { throw new RuntimeException(e); } } return null; } }); } private static URLStreamHandler wrap(final URLStreamHandler streamHandler) { return new URLStreamHandler() { @Override protected URLConnection openConnection(URL u) throws IOException { URLConnection conn; try { Method openConnectionMethod = URLStreamHandler.class .getDeclaredMethod("openConnection", URL.class); openConnectionMethod.setAccessible(true); conn = (URLConnection) openConnectionMethod.invoke( streamHandler, u); conn.setRequestProperty("Referer", REFERER_URL); return conn; } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { if (e.getTargetException() instanceof IOException) { throw (IOException) e.getTargetException(); } else { throw new RuntimeException(e); } } } }; } 

EDIT: se ha modificado para trabajar en versiones anteriores a Android 4.4 Kitkat así

Puede establecer un encabezado fácilmente como este:

  final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36"; final String URL = "http://www.cnn.com"; final String REFERER_URL = "http://www.w3.org/hypertext/DataSources/Overview.html"; HttpClient httpclient = new DefaultHttpClient(); HttpGet request = new HttpGet(URL); // add request header request.addHeader("User-Agent", USER_AGENT); request.addHeader("Referer", REFERER_URL); try { HttpResponse response = httpclient.execute(request); } catch (Exception e) { // ... } 

He añadido "Usuario-Agente", así, ya que la mayoría de los sitios utilizan que en lugar de "Referer" para determinar si un cliente es un navegador móvil o no.

Tenga en cuenta que "Referer" está mal escrito; Esto es intencional en mi código. Vea este enlace . Adivinando que fue un error tipográfico hace muchos años y sólo pegado.

  • Problema de error de aplicación en el emulador de Android "Hubo un error de red"
  • Http obtener solicitud en Android 2.3.3
  • ¿Alguien tuvo el éxito burlándose HttpRequests con Robolectric?
  • Uso de la biblioteca AQuery con la solicitud PUT y StringEntity (String)
  • ¿Cómo puedo hacer que una aplicación de Android se comunique con un servidor web a través de Internet?
  • Android httpGet problema
  • ¿Puedo detener HTTPResponseCache comportándose como una caché compartida con respecto a los encabezados de Cache-Control?
  • okhttp carga de imagen multipart con nombre de archivo
  • Envío de archivos mediante POST con HttpURLConnection
  • Límite de mensajería en la nube de Google
  • Analizar xml de la respuesta httppost
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.