Pasos para transmitir de forma programada de Android a receptor de miracast

Estoy tratando de escribir una aplicación que comenzará a lanzar la pantalla de un teléfono Android a un televisor vía miracast. Estoy usando un dongle HDMI ya que la televisión en cuestión no admite nativamente el milagro. He estado intentando el código aquí , pero necesita un ID de la aplicación que tengo siguiendo estos pasos . Mi pregunta es, las instrucciones parecen indicar que tengo que registrar el dongle miracast para que hable con una aplicación de depuración inédita. Sin embargo, sólo se mencionan los dispositivos de Google Cast y ese no es el mismo protocolo que el miracast. ¿Debo registrar el dongle?

¿Existe una forma más sencilla de programación de casting a un dispositivo a través de miracast? Un requisito no es la interacción del usuario, así que no puedo mostrar un botón de conversión.

Estoy usando Android 5.1 si es relevante.

EDIT : Después de más investigaciones, me di cuenta de que Google Cast utiliza un protocolo completamente diferente de Miracast, y por lo tanto todo el hablar de registrar el dongle es irrelevante. No se requiere registro alguno para hacer Miracast en Android. El problema es que la API está oculta, vea mi respuesta a continuación para más detalles.

Así que esto es posible, pero sólo en las versiones personalizadas de Android debido a los problemas de permiso.

Lo que debes usar

La parte oculta de la API de WifiDisplay lo hace todo posible. Este archivo contiene ejemplos de cómo usar la API para emitir la presentación. Parece que Google lo publicará públicamente en algún momento, aunque todavía está escondido en el último maestro de API 23 por lo que puedo ver.

Cómo acceder a la API oculta

Para utilizar APIs ocultas, esta guía proporciona una buena introducción. Sin embargo, si utiliza la API 22+, esa guía no funcionará, ya que el formato de android.jar ha cambiado y classes.dex se ha dividido en varios archivos. Así que este consejo es más exacto en ese caso. No es que el ps sobre framework-classes2.dex también se debe hacer; no es opcional.

La última versión de la herramienta dex2jar falla al convertir el archivo .dex de la API 22 en un tarro. La solución es mencionada por el autor aquí . He optado por parchar la herramienta en lugar de cambiar el dex, ya que no funcionó para mí. Simplemente cambie la línea que el autor menciona lanzando una RuntimeException a:

 return TypeClass.INT; 

Cómo obtener permiso para usar la API oculta

Una vez que todo está hecho, el siguiente paso es darle a tu aplicación el permiso CONFIGURE_WIFI_DISPLAY . Desafortunadamente, como se puede ver aquí , tiene protección a nivel de sistema. Esto significa que su aplicación debe estar firmada por la misma clave que el sistema para utilizar este permiso. Por lo tanto, a menos que tenga la clave privada de Google, no podrá ejecutar su aplicación en teléfonos Android normales. Mi solución fue construir una versión personalizada de CyanogenMod (usando esta guía), con el permiso cambiado de "sistema" a "normal". Esto elimina la necesidad de molestarse con la firma de nada. También hice lo mismo para el permiso CONTROL_WIFI_DISPLAY . Aunque no estoy completamente seguro de que esto sea necesario, no duele. Ambos permisos se encuentran en frameworks/base/core/res/AndroidManifest.xml . Cambie las líneas 2161-2169 de:

 <permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" android:protectionLevel="signature" /> <permission android:name="android.permission.CONTROL_WIFI_DISPLAY" android:protectionLevel="signature" /> 

A:

 <permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY" android:protectionLevel="normal" /> <permission android:name="android.permission.CONTROL_WIFI_DISPLAY" android:protectionLevel="normal" /> 

A continuación, cree CyanogenMod como normal. Puedo confirmar esto funciona, pero esto limita su aplicación a ejecutarse en dispositivos que tienen esta versión personalizada de CyanogenMod instalado. Además, la instalación de CyanogenMod en un teléfono Android generalmente invalidará la garantía.

  • ¿Cómo obtengo un descubrimiento de servicio Wi-Fi punto a punto para trabajar?
  • Transferencia de datos entre dispositivos Android mediante wifi directo?
  • ¿Qué es diferente de NSD y WifiP2pManager?
  • WiFi-Direct en JellyBean, WPA Suplicante desordenado
  • Transmisión por Wi-Fi Direct
  • ¿Puede Windows Phone 8 y Android conectarse a través de Wifi Direct?
  • Cómo detener el descubrimiento de pares en WifiDirect Android
  • Wifi-Direct siempre se desconecta después de treinta minutos
  • ¿Podemos conectarnos al iPhone desde un dispositivo Android aunque no esté en la misma red?
  • ¿Existe un equivalente de Wi-Fi Direct / Wi-Fi P2P para Phonegap / Cordova?
  • Conecta Raspberry con Android a través de servicios Wifi Direct (p2p)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.