transfiere teléfono solo reconoce porque modo masivo dispositivo datos cómo cualquier conexión como celular carga cambiar cable almacenamiento activar android permissions usb android-ndk libusb

android - reconoce - porque mi cable usb no transfiere datos y solo carga mi teléfono



¿Cómo dar permisos/dev/bus/usb para aplicaciones libusb para Android? (4)

Estoy desarrollando una Aplicación que usa libusb a través de jni. esta aplicación actualmente está orientada solo a las máquinas rooteadas, usb-host Android 3+.

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 .so bibliotecas nativas son parte de una infraestructura que instalo (como raíz) en / system / lib, que luego puede ser utilizada por las Actividades de Java, ejecutadas por los usuarios simples.

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

Tengo todo para que funcione bien, excepto por un problema: los permisos usb: los permisos predeterminados 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, lo que me obliga a "chmod 666" la entrada / dev correspondiente, para que funcione.

esta solución no es tan buena, sin embargo, porque no sobrevive el reinicio, o desenchufar / volver a conectar el dispositivo (los permisos se remontan a 0660).

la solución que estoy buscando necesita:

  • sobrevivir el reinicio / replugging
  • ser instalado ~ una vez ~ por la raíz, y no involucrar molestar al usuario cada vez para obtener permisos
  • ser genérico y ejecutar en todas (/ la mayoría) de las máquinas android 3+
  • [no obligatorio] da las credenciales mínimas necesarias

direcciones en las que pensé:

  • cambiar los permisos en /init.rc o /ueventd.rc -> ambos se anulan en cada reinicio
  • el montaje de usbfs / proc / bus / usb con devmode = 0666 -> sobrevive el replugging, pero no se reinicia
  • hacer que mi proceso se una al grupo "usb" -> probé android.permission.ACCESS_USB, pero no funciona / es compatible ...: /

¿algunas ideas? :-)

¡Gracias!


Encontré la solución sin rootear el dispositivo.

Probado en Android 4.2.2 Kernel versión 3.3.39

Todo lo que necesita hacer es agregar su aplicación al grupo "usb"

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

Elija un permiso que no use, por ejemplo "android.permission.CAMERA".

Modifique /system/etc/permissions/platform.xml de la siguiente manera:

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

Por lo tanto, agregue <uses-permission android:name="android.permission.CAMERA" /> al archivo de manifiesto de su aplicación, y ¡disfrute del usb accesible de libusb!


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 los dispositivos Android no permitirá 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 aconsejable otorgar a todas las aplicaciones permisos de lectura y escritura para estos archivos.

Para los dispositivos rooteados, el código que utiliza libusb podría ejecutarse como root utilizando el comando "su". Una alternativa sería usar el comando "su" para cambiar los permisos en los archivos / dev / bus / usb / apropiados.

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


Tengo el mismo problema y lo resuelvo haciendo esto en el ndk, cambiando / proc / bus / usb para donde esté montado 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; }


Editar:

Después de volver a leer la pregunta, está claro que no entendí que la máquina host ejecutaba Android. Como udev no existe en Android, la respuesta a continuación no responde la pregunta. Dejo esta respuesta aquí en caso de que alguien esté buscando información para que los dispositivos Android sean reconocidos por una PC host que no sea de Android.

Fin Editar

Los permisos predeterminados en esos controladores (/ dev / bus / usb / ### / ###) están 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, deberá crear su propio archivo udev .rules. Para hacerlo, necesita la identificación del proveedor del dispositivo al que desea otorgar el permiso. lsusb imprimirá la identificación del dispositivo para cualquier dispositivo en particular, y si quieres una lista de todos los proveedores, puedes probar esto .

Por lo tanto, en su 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 anteriormente, utilizan = en lugar de: = y SYSFS en lugar de ATTRS. No sé por qué, pero descubrí que ese archivo no funcionaba literalmente en mi máquina.

Después de escribir el archivo,

restart usbserial

y vuelve a enchufar tu dispositivo. Ahora debería tener un valor predeterminado de 666 permisos.