¿Cómo comunicarse con un dispositivo USB?
Estoy intentando establecer la comunicación del USB como anfitrión. Estoy siguiendo los ejemplos aquí http://developer.android.com/guide/topics/usb/host.html pero no puedo conseguir este trabajo. Aquí está mi código:
private static final String ACTION_USB_PERMISSION = "com.multitools.andres.LCView"; UsbDevice device; //Pide permisos al usuario para comunicacion con el dispositivo USB private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if(device != null){ //call method to set up device communication } } else { Log.d(TAG, "permission denied for device " + device); } } } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(DEBUG) Log.i(TAG, "onCreate() -> MainMenu"); actionBar = getActionBar(); //obtengo el ActionBar actionBar.setDisplayHomeAsUpEnabled(true); //el icono de la aplicacion funciona como boton HOME //Menu setListAdapter(new ArrayAdapter<String>(MainMenu.this, android.R.layout.simple_list_item_1, MenuNames)); //USB if(DEBUG) Log.i(TAG, "Setting UsbManager -> MainMenu"); UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); PendingIntent mPermissionIntent; if(DEBUG) Log.i(TAG, "Setting PermissionIntent -> MainMenu"); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); if(DEBUG) Log.i(TAG, "Setting IntentFilter -> MainMenu"); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); if(DEBUG) Log.i(TAG, "Setting registerReceiver -> MainMenu"); registerReceiver(mUsbReceiver, filter); if(DEBUG) Log.i(TAG, "Setting requestPermission -> MainMenu"); mUsbManager.requestPermission(device, mPermissionIntent); }
Recibo el cuadro de diálogo Cerrar la fuerza cuando descomente la línea mUsbManager.requestPermission(device, mPermissionIntent);
Si lo comento, no consigo cerrar la fuerza, pero no funciona. Creo que el problema está en:
- No puedo conectar mi Nexus5 a OSx Yosemite
- Debugging con Android USB en VirtualBox
- ¿Cómo configurar el modo de conexión USB?
- ¿Por qué adb vuelve a estar sin conexión después de la cadena del dispositivo?
- Ruta de audio desde Android Phone a PC a través de USB?
private static final String ACTION_USB_PERMISSION = "com.multitools.andres.LCView";
En el ejemplo de Google es como:
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
Pero no sé qué exactamente tengo que poner allí y no pude encontrar ninguna explicación sobre eso. ¿Qué tengo que poner allí o dónde está mi error? Aquí está el LogCat que estoy recibiendo cuando inicio mi aplicación:
04-17 00:57:50.944: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:51.331: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:51.981: I/(1362): onCreate() -> MainMenu 04-17 00:57:52.013: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:52.151: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:52.570: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:52.731: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:53.122: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:53.231: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:53.390: I/(1362): Setting UsbManager -> MainMenu 04-17 00:57:53.451: I/(1362): Setting PermissionIntent -> MainMenu 04-17 00:57:53.470: I/(1362): Setting IntentFilter -> MainMenu 04-17 00:57:53.470: I/(1362): Setting registerReceiver -> MainMenu 04-17 00:57:53.511: I/(1362): Setting requestPermission -> MainMenu 04-17 00:57:53.660: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:53.791: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:54.311: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:54.401: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:54.531: I/(1362): onCreateOptionsMenu() -> MainMenu 04-17 00:57:54.683: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:54.772: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:55.186: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:55.291: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:55.661: I/dalvikvm(1362): threadid=3: reacting to signal 3 04-17 00:57:55.751: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 04-17 00:57:55.791: D/gralloc_goldfish(1362): Emulator without GPU emulation detected. 04-17 01:11:47.323: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:47.720: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:48.124: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:48.291: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:48.452: I/(1459): onCreate() -> MainMenu 04-17 01:11:48.691: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:48.813: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:49.172: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:49.321: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:49.653: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:49.821: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:49.901: I/(1459): Setting UsbManager -> MainMenu 04-17 01:11:49.931: I/(1459): Setting PermissionIntent -> MainMenu 04-17 01:11:50.021: I/(1459): Setting IntentFilter -> MainMenu 04-17 01:11:50.031: I/(1459): Setting registerReceiver -> MainMenu 04-17 01:11:50.051: I/(1459): Setting requestPermission -> MainMenu 04-17 01:11:50.071: D/AndroidRuntime(1459): Shutting down VM 04-17 01:11:50.133: W/dalvikvm(1459): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 04-17 01:11:50.231: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:50.331: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:50.401: E/AndroidRuntime(1459): FATAL EXCEPTION: main 04-17 01:11:50.401: E/AndroidRuntime(1459): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.multitools.andres/com.multitools.andres.MainMenu}: java.lang.NullPointerException 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.ActivityThread.access$600(ActivityThread.java:123) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.os.Handler.dispatchMessage(Handler.java:99) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.os.Looper.loop(Looper.java:137) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.ActivityThread.main(ActivityThread.java:4424) 04-17 01:11:50.401: E/AndroidRuntime(1459): at java.lang.reflect.Method.invokeNative(Native Method) 04-17 01:11:50.401: E/AndroidRuntime(1459): at java.lang.reflect.Method.invoke(Method.java:511) 04-17 01:11:50.401: E/AndroidRuntime(1459): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 04-17 01:11:50.401: E/AndroidRuntime(1459): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 04-17 01:11:50.401: E/AndroidRuntime(1459): at dalvik.system.NativeStart.main(Native Method) 04-17 01:11:50.401: E/AndroidRuntime(1459): Caused by: java.lang.NullPointerException 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.os.Parcel.readException(Parcel.java:1333) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.os.Parcel.readException(Parcel.java:1281) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.hardware.usb.IUsbManager$Stub$Proxy.requestDevicePermission(IUsbManager.java:535) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.hardware.usb.UsbManager.requestPermission(UsbManager.java:361) 04-17 01:11:50.401: E/AndroidRuntime(1459): at com.multitools.andres.MainMenu.onCreate(MainMenu.java:80) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.Activity.performCreate(Activity.java:4465) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 04-17 01:11:50.401: E/AndroidRuntime(1459): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 04-17 01:11:50.401: E/AndroidRuntime(1459): ... 11 more 04-17 01:11:50.751: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:50.851: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:51.331: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:51.403: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 04-17 01:11:51.774: I/dalvikvm(1459): threadid=3: reacting to signal 3 04-17 01:11:51.961: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt'
Gracias 🙂
- Android adb velocidad usb
- ¿Por qué el eclipse ADT no reconoce mi dispositivo android en Windows?
- Cómo cargar mi aplicación de Eclipse a mi teléfono Android en lugar de AVD
- No se puede configurar los controladores de usb para depurar en Galaxy Nexus
- Utilice el archivo de recursos device_filter.xml para filtrar resultados de enumeración USB
- Anulación inversa de Android o acceso a LAN o Internet mediante cable USB
- HP TouchPad USB conduce en Android
- Cómo obtener la pantalla táctil Resistiva USB para trabajar en Android.
Esa cadena es sólo un marcador para que reconozca la intención que se devuelve cuando se llama registerReceiver(mUsbReceiver, filter);
. Ese no es el problema.
Creo que el problema está aquí:
UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
Esta línea se supone que para obtener su USB Manager, pero por lo que recuerdo no todos los teléfonos tienen que soportar el Android USB Accessory API. Esta línea es, probablemente, sólo asignar null
a mUsbManager
que a continuación, le causa NullPointerException
cuando se llama a un método más abajo en el código. Tratar de comprobar si no es null
antes de hacer una llamada.
Para obtener más información, consulte estos enlaces:
- http://developer.android.com/guide/topics/usb/index.html
- http://developer.android.com/guide/topics/usb/accessory.html
EDITAR:
Creo que veo cuál es el problema ahora. Tienes razón, no es el USB Manager. Es el objeto UsbDevice ( device
). Nunca se inicializa en ningún lugar de su código. En esta línea:
mUsbManager.requestPermission(device, mPermissionIntent);
Básicamente está deshabilitando una intención de preguntar al usuario si está bien que trabaje con el dispositivo representado por el device
objeto UsbDevice. Sin embargo, cuando esta llamada se disparó device
aún no se ha inicializado (y por lo tanto tiene el valor predeterminado de null
). Por lo tanto, cuando intenta solicitar permiso, termina obteniendo una NullPointerException
lugar del resultado esperado. Para corregir esto, necesita averiguar a qué dispositivo desea conectarse y asignarlo al device
. Mire aquí , en "Enumeración de dispositivos" para descubrir diferentes maneras de hacer eso. De una forma, si conoce el nombre del dispositivo al que desea conectarse, debe realizar las siguientes llamadas después de recuperar el Administrador de Usb:
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); device = deviceList.get("<deviceName>");
(Obviamente, usted reemplazaría <deviceName>
por el nombre real del dispositivo.
minSdkVersion
debe> = 12
Para habilitar la compatibilidad con la API del host USB, debe agregar un archivo denominado android.hardware.usb.host.xml que contenga las siguientes líneas:
<permissions> <feature name="android.hardware.usb.host"/>
- Android: No se puede realizar esta acción después de onSaveInstanceState
- ¿Por qué es Intent.getAction () nulo de mi actividad de búsqueda?