android - toshiba - miracast pc
Pasos para emitir de forma programática desde el receptor android a miracast (1)
Intento escribir una aplicación que comenzará a transmitir la pantalla desde un teléfono Android a un televisor a través de miracast. Estoy usando un dongle HDMI ya que el televisor en cuestión no es compatible nativamente con miracast. He estado intentando el código aquí , pero necesita una ID de aplicación que tengo siguiendo estos pasos . Mi pregunta es, las instrucciones parecen indicar que tengo que registrar el dongle Miracast para que se comunique con una aplicación de "depuración" no publicada. Sin embargo, solo se mencionan los dispositivos Google Cast y ese no es el mismo protocolo que miracast. ¿Todavía tengo que registrar el dongle?
¿Hay alguna forma más sencilla de transmitir mediante programación a un dispositivo a través de miracast? Un requisito es la interacción del usuario, por lo que no puedo mostrar un botón de envío.
Estoy usando Android 5.1 si eso es relevante.
EDITAR : Después de más investigaciones, me di cuenta de que Google Cast utiliza un protocolo completamente diferente de Miracast, y por lo tanto, toda la conversación sobre el registro del dongle es irrelevante. No es necesario registrarse para hacer Miracast en Android. El problema es que la API está oculta, consulta mi respuesta a continuación para obtener más información.
Así que esto es posible, pero solo en versiones personalizadas de Android debido a problemas de permisos.
Lo que necesitas usar
La parte oculta de la API WifiDisplay lo hace todo posible. Este archivo contiene ejemplos de cómo usar la API para transmitir la pantalla. Parece que Google lo lanzará públicamente en algún momento, aunque todavía está oculto en el último master de API 23 por lo que puedo ver.
Cómo acceder a la API oculta
Para utilizar API ocultas, esta guía proporciona una buena introducción. Sin embargo, si usa 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. Entonces este consejo es más preciso en ese caso. Tenga en cuenta que la posdata sobre framework-classes2.dex
también debe hacerse; no es opcional
La última versión de la herramienta dex2jar
no puede convertir el archivo .dex de la API 22 en un contenedor. La solución es mencionada por el autor aquí . Opté por parchear la herramienta en lugar de cambiar el dex, ya que eso no funcionó para mí. Simplemente cambie la línea que el autor menciona de arrojar 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 su aplicación el permiso CONFIGURE_WIFI_DISPLAY
. Desafortunadamente, como 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 usar este permiso. Entonces, a menos que tenga la clave privada de Google, no puede hacer que su aplicación se ejecute 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 preocuparse por firmar cualquier cosa. También hice lo mismo con 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" />
Luego construye CyanogenMod como siempre. Puedo confirmar que esto funciona, pero esto limita su aplicación a la ejecución en dispositivos que tienen instalada esta versión personalizada de CyanogenMod. Además, la instalación de CyanogenMod en un teléfono Android generalmente invalidará la garantía.