2012-06-28 20 views
8

Recientemente he intentado recibir el intento android.hardware.usb.action.USB_DEVICE_ATTACHED utilizando un receptor de difusión según todas las muestras y ejemplos que he visto.USB_DEVICE_ATTACHED solo inicia la actividad de Galaxy S3 ICS

He declarado un receptor en el manifiesto;

<receiver android:name=".UsbDeviceReceiver"> 
     <intent-filter> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
       android:resource="@xml/device_filter"/> 

También he hecho algo similar en el código de actividad - onStart y OnStop registrar/anular el registro del receptor.

IntentFilter filter = new IntentFilter(); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 

    registerReceiver(mUsbReceiver, filter); 

Sin embargo, me doy cuenta de que la intención es atrapada. Al observar logcat, veo que al conectar un dispositivo usb se buscan actividades para comenzar, mientras se desconecta la difusión del intento de detach. De acuerdo con las muestras antes mencionadas, este no debería ser el caso.

¿Me falta algo drástico con respecto a los metadatos? No tengo ningún problema con android.hardware.usb.action.USB_DEVICE_DETACHED. Tal vez este es un error con la versión de Android instalada en la galaxia s3? Quizás esta es una 'característica' de ICS.

¡Cualquier información relativa es bienvenida!

+2

El código (ver por ejemplo) https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/usb/UsbSettingsManager.java lo hace no envíe una transmisión en el archivo adjunto del dispositivo, solo inicia la actividad específicamente registrada para manejar ese dispositivo. Alguien envió un parche en gerrit para enviar la transmisión, pero parece haber sido rechazado debido a un desajuste con la filosofía de diseño. –

+0

Hola Chris, gracias por la respuesta concisa. Es un alivio que esto no sea solo un problema con mi dispositivo. ¿Todavía existe el envío del parche para que pueda leer con más detalle las razones de este comportamiento? Mi solución en este momento implicará una actividad invisible y mi propia transmisión. Se siente como un truco. Publicaré el código cuando haya terminado. – Gusdor

Respuesta

4

Este es un defecto conocido:

http://code.google.com/p/android/issues/detail?id=25701

y aquí:

http://code.google.com/p/android/issues/detail?id=25703

Pero no contenga la respiración a la espera de su fijación. Mientras mira el informe de errores, márquelo para que se le notifiquen las actualizaciones del informe. Es probable que sean comentarios de otras personas pidiendo que se solucione.

+0

Gracias por los enlaces Dave. Me he resignado a tener que dar una vuelta de tuerca. Programo una tarea regular para observar usb mientras se reanuda la actividad. No me gusta hacerlo y probablemente no sea genial para la batería pero funciona bastante feliz. – Gusdor

1

La solución alternativa que he encontrado para USB_ACCESSORY_ATTACHED es simplemente tener un botón que llama a mi método OpenAccessory(accessory) otra vez y que parece estar funcionando para mí. Tal vez eso funcione para USB_DEVICE_ATTACHED también. Solo tiene un dispositivo conectado/no conectado en algún lugar y si no está conectado, el usuario puede presionar ese botón.

Editar: He encontrado que poner android:launchMode="singleTask" en el manifiesto parece "registrar" la intención de USB_ACCESSORY_ATTACHED, aunque nunca aparece como tal, funciona como si eso fuera lo que estaba haciendo.

0

puede declarar la intención de filtro en el manifiesto como se explica aquí: http://developer.android.com/guide/topics/connectivity/usb/host.html

entonces usted coge android.hardware.usb.action.USB_DEVICE_ATTACHED en onResume() o en onNewIntent().

cuando su actividad se está ejecutando y conecta su dispositivo usb, la intención principal se lanza a onResume() pero android.hardware.usb.action.USB_DEVICE_ATTACHED al onNewIntent(). Ajusta tu código de acuerdo a eso.

puede declarar onNewIntent() de la siguiente manera:

@Override 
    protected void onNewIntent(Intent intent) 
    { 
     super.onNewIntent(intent); 
     System.out.println("onNewIntent" + intent.getAction()); 
     if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) { 
     mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
     if(mDevice!= null) 
      mUsbManager.requestPermission(mDevice, mPermissionIntent); 
     } 
    } 

y onResume() de manera similar.

probado en android 4.0.4 Dispositivo: Samsung Galaxy tab 750

Cuestiones relacionadas