¿Cómo dar permisos / dev / bus / usb para aplicaciones libusb android?

Estoy desarrollando una aplicación que utiliza libusb vía jni. Esta aplicación está dirigida actualmente sólo a las máquinas con Android 3+ enrutadas.

El escenario es el siguiente:

<java Activity> loads <jni_wrapper.so> which wraps <my_main_lib.so> that uses <libusb.so> that needs rw access to: /dev/bus/usb/<device> 

Todas las bibliotecas nativas de .so son parte de una infraestructura que instalo (como root) en / system / lib, que luego puede ser utilizada por java Activities, ejecutada por los usuarios simples.

Eso significa que toda la comunicación usb debe hacerse desde el lado nativo.

Tengo todo para trabajar bien, excepto por un problema – los permisos usb: los permisos por defecto de / dev / bus / usb / entries son (0660, uid = root, gid = usb).

Obviamente, un proceso java estándar que ejecuta un código nativo no cumple con ninguno de los requisitos anteriores, forzándome a "chmod 666" la entrada / dev correspondiente, para que esto funcione.

Esta solución no es tan buena, sin embargo, porque no sobrevive a reiniciar, o desconectar / replugging del dispositivo (permisos volver a 0660).

La solución que estoy buscando necesita:

  • Sobrevivir reiniciar / replugging
  • Ser instalado ~ una vez ~ por la raíz, y no involucrar molestar al usuario cada vez que gane permisos
  • Ser genérico y correr en todas las máquinas (+ la mayoría) android 3+
  • [No obligatorio] da las credenciales mínimas necesarias

Cómo llegar i thought of:

  • Cambiar permisos en /init.rc o /ueventd.rc -> ambos se anulan en cada reinicio
  • Usbfs / proc / bus / usb con devmode = 0666 -> sobrevive al replugging, pero no reinicia
  • Haciendo que mi proceso se une al grupo "usb"? -> He intentado android.permission.ACCESS_USB, pero no funciona / soportado …: /

¿algunas ideas? Todos los derechos reservados

¡Gracias!

Tengo el mismo problema y lo soluciono haciendo esto en el ndk, cambiando / proc / bus / usb para donde se monta el usb en su caso. Espero eso ayude.

 r = system("su -c \"chmod -R 777 /proc/bus/usb/\""); if(r!=0) { LOGD("Could not grant permissions to USB\n"); eturn CANT_GRAN_PERMISSION_USB; } 

Hay algún método del equipo de desarrolladores de libusb. Para mi caso, selecciono el primer método.

Desde: https://github.com/libusb/libusb/blob/master/android/README

Permisos de tiempo de ejecución:

La configuración predeterminada del sistema en la mayoría de dispositivos Android no permite el acceso a dispositivos USB. Hay varias opciones para cambiar esto.

Si tiene control de la imagen del sistema, puede modificar el ueventd.rc utilizado en la imagen para cambiar los permisos en / dev / bus / usb / / . Si utiliza este enfoque, es aconsejable crear un nuevo permiso de Android para proteger el acceso a estos archivos. No es recomendable otorgar a todos los usuarios permisos de lectura y escritura a estos archivos.

Para los dispositivos enraizados, el código que utiliza libusb se podría ejecutar como root mediante el comando "su". Una alternativa sería utilizar el comando "su" para cambiar los permisos en los archivos / dev / bus / usb / apropiados.

Los usuarios han informado del éxito en el uso de android.hardware.usb.UsbManager para solicitar permiso para usar UsbDevice y, a continuación, abrir el dispositivo. Las dificultades en este método es que no hay garantía de que siga funcionando en las futuras versiones de Android, se requiere invocar las API de Java y ejecutar código para hacer coincidir cada android.hardware.usb.UsbDevice con un libusb_device.

Editar:

Después de volver a leer la pregunta, es claro que no entendí que la máquina host estaba ejecutando Android. Como udev no existe en Android, la respuesta a continuación no responde a la pregunta. Estoy dejando esta respuesta aquí en caso de que alguien esté buscando información sobre cómo conseguir que los dispositivos Android sean reconocidos por una computadora host linux no Android.

End Edit

Los permisos predeterminados de estos controladores (/ dev / bus / usb / ### / ###) son determinados por udev. En particular, analiza los archivos de configuración en /etc/udev/rules.d y /lib/udev/rules.d en orden numérico para determinar los valores predeterminados.

Para anular los valores predeterminados, tendrá que crear su propio archivo udev .rules. Para ello, necesita el ID de proveedor del dispositivo al que desea conceder permiso. Lsusb imprimirá la identificación del dispositivo para cualquier dispositivo en particular y, si desea una lista de todos los proveedores, puede probar esto .

Por lo tanto, en el archivo /etc/udev/rules.d/99-android.rules, complete la siguiente línea para cada proveedor que desee admitir:

 SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE:="0666" 

Tenga en cuenta que en el ejemplo vinculado a lo anterior, utilizan = en lugar de: = y SYSFS en lugar de ATTRS. No sé por qué, pero me encontré con que ese archivo no funcionaba literalmente en mi máquina.

Después de escribir el archivo,

 restart usbserial 

Y vuelva a enchufar el dispositivo. Debe ahora tener por defecto 666 permisos.

Encontré la solución sin enraizar el dispositivo.

Probado en Android 4.2.2 Kernel versión 3.3.39

Todo lo que necesitas hacer es añadir tu aplicación al grupo "usb"

Sin root, puede usar el archivo de permisos en /system/etc/permissions/platform.xml

Elige un permiso que no uses, por ejemplo "android.permission.CAMERA".

Modifique /system/etc/permissions/platform.xml como este:

 <permissions> ... <permission name="android.permission.CAMERA" > <group gid="camera" /> </permission> <permission name="android.permission.CAMERA" > <group gid="usb" /> </permission> ... </permissions> 

Por lo tanto, agrega <uses-permission android:name="android.permission.CAMERA" /> a su archivo de manifiesto de aplicación, y disfrutar de libusb accesible usb!

  • Android como anfitrión de ATtiny85 Digispark
  • ¿Cómo montar la trayectoria del USB en androide?
  • La obtención de un cable USB conectado al evento IN / OUT utilizando EXTRA_PLUGGED no funciona
  • Escribir datos en USB HID usando Javascript, HTML5 o cualquier lenguaje de plataforma cruzada (compatible con Android)
  • Android bulkTransfer devuelve -1 cuando lee datos pero realmente hay algunos datos en el buffer
  • Copia de la aplicación de escritorio java y transferencia de datos de android a través de USB
  • Servicio de modo de host USB Android - Inicio basado en USB_DEVICE_ATTACHED
  • Ruta de audio desde Android Phone a PC a través de USB?
  • Acceso a los formatos FAT32 y NTFS USB Pendrive de la tableta android
  • Mi Macbook Pro no detectará mi samsung galaxy s6
  • USB debugging - Problema con la instalación de controladores para Epson Moverio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.