Tengo una aplicación que se ejecuta en una tableta Android sin nombre rooteada que ejecuta ICS 4.0.3 que controla un dispositivo USB a través de la interfaz de modo de host USB. El archivo android.hardware.usb.host.xml está presente en / system / etc / permissions y todo funciona de maravilla. Excepto...
Cuando ejecuto la aplicación por primera vez después de un reinicio y luego enchufo el dispositivo USB, aparece una ventana emergente que dice "¿Permitir que la aplicación APPNAME acceda al dispositivo USB? [] Usar de forma predeterminada para este dispositivo USB. Cancelar Aceptar" y Tengo que tocar Aceptar antes de que pueda comenzar a usar el dispositivo.
Necesito desactivar la confirmación del usuario para que la aplicación pueda usar el dispositivo de inmediato. ¿Cómo hago esto? Me parecen algunas sugerencias sobre el uso de un generador de pulsación de teclas para simular que el usuario toque el botón en la pantalla, pero prefiero evitar ese tipo de enfoque y configurar las cosas para que la solicitud de confirmación simplemente no suceda.
Probablemente no pueda hacer que el proveedor haga una compilación de kernel personalizada para mí, pero debería poder obtener la clave de firma del firmware para poder firmar mi aplicación como una aplicación del sistema, si eso ayuda.
Un problema asociado: marcar la casilla "Usar de forma predeterminada para este dispositivo USB" no parece ayudar; si desconecto y vuelvo a conectar el dispositivo, aparece el mensaje de confirmación nuevamente. He notado en esta situación que el número de dispositivo en / dev / bus / usb / 001 / cambia cada vez que desconecto y vuelvo a conectar (001, 002, 003, etc.), lo que tal vez explica este problema en particular.
fuente
Respuestas:
Esta pregunta y respuesta es básicamente un duplicado de
/programming//a/15151075/588476.
Vea el enlace de arriba para ver un programa de ejemplo y una discusión más detallada.
Hasta donde sé, hay dos formas de obtener la ventana emergente del cuadro de permisos USB:
En el caso de 1, descubrí que la casilla de verificación en la ventana emergente para recordar el permiso no tiene ningún efecto.
Para mí, eliminé todo el código relacionado con los permisos de mi software y simplemente puse el filtro de intención en mi manifiesto. Cuando el dispositivo USB está enchufado, si aún no se le ha otorgado permiso, aparecerá el cuadro de permiso USB. Si el usuario hace clic en Aceptar sin marcar la casilla de recordar, entonces la casilla volverá a aparecer la próxima vez que se conecte el dispositivo. Sin embargo, si el usuario marca la casilla y presiona OK, la casilla nunca debería volver a aparecer (a menos que el software se desinstale y luego se vuelva a instalar).
No estoy seguro de si hay un error en algún lugar relacionado con su dispositivo que aparece como / dev / bus / usb / 001 y luego 002, etc. hacer nada.
No sé de ninguna manera que pueda evitar la ventana emergente de permisos por completo. Sospecho que no hay forma de hacerlo sin profundizar en el código de Android como dijiste.
fuente
Además de mi comentario, eché un vistazo al código subyacente de Android.
Tengo una respuesta posible, pero con no menos de cuatro advertencias y obstáculos principales:
¡Olvídate de esto si implementas aplicaciones ordinarias del mercado de accesorios!
El primer requisito previo es que tenga el
MANAGE_USB
permiso. Eso se describe aquí .Sin embargo, a su vez, los requisitos previos para eso son que firme con la clave del sistema e instale su aplicación en / system / app.
De todos modos, si estás de acuerdo con eso, aquí hay un código:
mDevice
es el dispositivo de antes.uid
es el UID de tu propia aplicación y puedes buscarlo. Un ejemplo de cómo hacerlo es la primera respuesta aquí .¿Todo bien? No.
ServiceManager
esandroid.os.ServiceManager
y por lo tanto no es una API pública. Esa, en este ejemplo, es su forma de obtener elIUsbManager
servicio (puede haber otras rutas). Ahora, superar eso está más allá del alcance de mi respuesta; en los viejos tiempos podías usar la reflexión, pero no sé si aún puedes.Después de todas esas travesuras, parece que ya no necesita solicitar permiso, y si lo hace, volverá inmediatamente sin diálogo.
fuente