¿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:
- Lectura de Android El accesorio USB lanza ENODEV IOException
- Nexus 7 no es recogido por adb (cuando lo conecto a la computadora portátil a través de usb)
- Macbook adb no puede abrir la interfaz
- No puedo conectar mi Nexus5 a OSx Yosemite
- USB Host Mode - Permiso de acceso al dispositivo concedido pero no recordado
<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!
- Samsung Galaxy s 3 driver usb
- ¿Es posible transferir archivos al teléfono inteligente durante la conexión?
- ¿Por qué VirtualBox no detecta mi dispositivo Android?
- Dibujando potencia desde el dispositivo USB a la tableta de Android a través del cable OTG
- Reproducir vídeo utilizando USB conectado a través de cable OTG en Android?
- Interfaces perdidas de Android 5.0 Lollipop UsbDevice
- Detección de dispositivo USB enchufado
- Los controladores usb para adb no funcionan para Motorola mc40
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!
- Cómo anular el registro del teléfono de la mensajería en la nube de firebase
- Android NDK limitaciones?