Cómo evitar que Android solicite permiso antes de permitir el acceso al dispositivo USB


19

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.


¿Qué sucede si implementa la aplicación en / system / app? Puede probar esto con y sin firma del sistema. Escribo esto como un comentario porque (a) no lo he probado y (b) no sé si este modelo de implementación está disponible para usted.
Rob Pridham

Respuestas:


10

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:

  1. Solicite permiso explícitamente desde su aplicación utilizando UsbManager.requestPermission (...)
  2. Registre un filtro de intención en su accesorio y permita que el sistema solicite permiso cuando el dispositivo esté conectado

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.


1
¿Estás seguro? Todavía veo la solicitud de permiso cuando el dispositivo se desconecta y se vuelve a conectar. Este comportamiento es coherente con la documentación en developer.android.com/guide/topics/connectivity/usb/host.html . La sección "Uso de un filtro de intención" dice "Si los usuarios aceptan, su aplicación automáticamente tiene permiso para acceder al dispositivo hasta que se desconecte"
kbro

Solo puedo responder por el Nexus 7, Galaxy S3 y Galaxy Note, en esos dispositivos solo tengo que aceptar el permiso una vez (el dispositivo Android se ejecuta en modo host), siempre que habilite la casilla de verificación para recordar la decisión. ¿Qué dispositivo / versión de Android está utilizando, tengo la sensación de que es un dispositivo personalizado / OEM?
Wayne Uroda

Es una tableta OEM de 7 pulgadas basada en el WonderMedia WM8850-mid SOM que ejecuta su versión de Android 4.0.3.
kbro

Los filtros de intención solo funcionan para la sesión de arranque actual. Sí, conecto un dispositivo usb a mi teléfono y me otorga permiso automáticamente
user924

7

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:

  1. No lo he probado, porque no tengo ningún dispositivo USB adecuado a mano.
  2. Necesitas un nuevo permiso
  3. El permiso requiere que seas una aplicación del sistema
  4. El código requiere acceso a algo que no está en la API pública

¡Olvídate de esto si implementas aplicaciones ordinarias del mercado de accesorios!

El primer requisito previo es que tenga el MANAGE_USBpermiso. 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:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice es el dispositivo de antes.

uides el UID de tu propia aplicación y puedes buscarlo. Un ejemplo de cómo hacerlo es la primera respuesta aquí .

¿Todo bien? No. ServiceManageres android.os.ServiceManagery por lo tanto no es una API pública. Esa, en este ejemplo, es su forma de obtener el IUsbManagerservicio (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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.