2012-06-28 2 views
8

Kürzlich habe ich versucht, die Absicht android.hardware.usb.action.USB_DEVICE_ATTACHED mit einem Broadcast-Empfänger zu erhalten, wie alle Beispiele und Beispiele, die ich gesehen habe.USB_DEVICE_ATTACHED startet nurAktivität von Galaxy S3 ICS

Ich habe einen Empfänger im Manifest deklariert;

<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"/> 

Ich habe auch in den Aktivitätscode ähnlich gemacht - onStart und OnStop registrieren/den Empfänger abmelden.

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

    registerReceiver(mUsbReceiver, filter); 

Allerdings finde ich, dass die Absicht gerade gefangen wird. Logcat beobachten Ich kann sehen, dass das Anhängen eines USB-Geräts nach Aktivitäten sucht, die gestartet werden sollen, während das Trennen der Verbindung die Entfernungsabsicht ausstrahlt. Gemäß den oben genannten Stichproben sollte dies nicht der Fall sein.

Fehle ich etwas drastisch in Bezug auf Metadaten? Ich habe überhaupt keine Probleme mit android.hardware.usb.action.USB_DEVICE_DETACHED. Vielleicht ist das ein Fehler mit der Android-Version, die auf der Galaxy S3 installiert ist? Vielleicht ist dies ein ICS-Feature.

Alle relevanten Informationen sind willkommen!

+2

Der Code (siehe zum Beispiel) https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/usb/UsbSettingsManager.java tut Senden Sie keine Sendung auf dem Gerät Anhang, es startet nur die Aktivität speziell für dieses Gerät registriert registriert. Jemand hat einen Patch auf Gerrit gesendet, um die Sendung zu senden, aber es scheint abgelehnt worden zu sein, weil die Design-Philosophie nicht stimmt. –

+0

Hallo Chris, danke für die knappe Antwort. Es ist eine Erleichterung, dass dies nicht nur ein Problem mit meinem Gerät ist. Gibt es die Patch-Einreichung noch, so dass ich die Gründe für dieses Verhalten genauer lesen konnte? Meine Problemumgehung wird im Moment eine unsichtbare Aktivität und meine eigene Sendung beinhalten. Es fühlt sich an wie ein Hack. Ich werde den Code posten, wenn ich fertig bin. – Gusdor

Antwort

4

Dies ist ein bekannter Defekt:

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

und hier:

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

Aber nicht halten Sie Ihren Atem warten auf sie fixiert werden. Während Sie sich den Fehlerbericht ansehen, markieren Sie ihn, damit Sie über Aktualisierungen des Berichts benachrichtigt werden. Wahrscheinlich werden das Kommentare von anderen Leuten sein, die darum bitten, dass es repariert wird.

+0

Danke für die Links Dave. Ich habe mich damit abgefunden, Workaround zu haben. Ich plane eine regelmäßige Aufgabe, um USB zu beobachten, während die Aktivität fortgesetzt wird. Ich mag es nicht, es zu tun und es ist wahrscheinlich nicht gut für die Batterie, aber es funktioniert ziemlich glücklich. – Gusdor

1

Die Problemumgehung, die ich für USB_ACCESSORY_ATTACHED gefunden habe, ist nur eine Schaltfläche, die meine OpenAccessory(accessory) Methode wieder aufruft und das scheint für mich zu arbeiten. Vielleicht funktioniert das auch für USB_DEVICE_ATTACHED. Stellen Sie einfach einen angeschlossenen/nicht verbundenen Status irgendwo her und wenn er nicht verbunden ist, kann der Benutzer einfach diesen Knopf drücken.

Edit: Ich habe festgestellt, dass Putting android:launchMode="singleTask" in der Manifest scheint die Absicht von USB_ACCESSORY_ATTACHED "registrieren", obwohl es nie als solche erscheint es funktioniert, als ob das ist, was es tut.

0

können Sie Intent-Filter im Manifest erklären, wie hier erklärt: http://developer.android.com/guide/topics/connectivity/usb/host.html

dann fangen Sie in onResume android.hardware.usb.action.USB_DEVICE_ATTACHED() oder in onNewIntent().

Wenn Ihre Aktivität ausgeführt wird und Sie Ihr USB-Gerät anhängen, wird die Hauptabsicht an onResume() übergeben, aber android.hardware.usb.action.USB_DEVICE_ATTACHED an onNewIntent(). Passen Sie Ihren Code entsprechend an.

können Sie onNewIntent() wie folgt deklarieren:

@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); 
     } 
    } 

und onResume (ähnlich).

getestet auf Android 4.0.4 Gerät: Samsung Galaxy Registerkarte 750