2013-08-02 14 views
8

Ich kodiere vor kurzem eine USB-Host-App, aber es ist steckengeblieben, weil ich das Ereignis Gerät angeschlossen/getrennt nicht erkennen kann, folgte ich der Codierung Note http://developer.android.com/guide/topics/connectivity/usb/host.html und beziehen Sie sich auf andere Codierung im Netzwerk, Nach mehreren Prüfungen kann ich das Problem immer noch nicht finden. Nach meinem Debugging scheint es, dass die Absicht UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED nicht passiert ist, weil ich versuche, Context.sendBroadcast() zu verwenden, um eine benutzerdefinierte Absicht zu senden, und mein BroadcastReceiver kann die Absicht empfangen. Aber wenn ich das USB-Gerät anschließe/entferne, läuft der BroadcastReceiver nicht. Das Handy, das ich benutze, ist HTC One-X, ich bin mir sicher, dass die OTG-Funktion korrekt ist, da die Mausfunktion perfekt funktioniert. Hier ist mein Codestück.Kann Broadcast nicht empfangen Absicht von UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.launcher); 
    mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE); 
    if(mUsbManager == null) { 
     Log.d(TAG, "mUsbManager is null"); 
    } 

    // listen for new devices 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
    // filter.addAction("MyTest"); 
    registerReceiver(mUsbReceiver, filter); 

} 

Die BroadcastReceiver

BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "mUsbReceiver.onReceive start"); 
     String action = intent.getAction(); 
     UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
     if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { 
      setDevice(device); 
     } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 
      if (mDevice != null && mDevice.equals(device)) { 
       setDevice(null); 
      } 
     } 
    } 
}; 

Manifest.xml

<uses-feature android:name="android.hardware.usb.host" /> 
<uses-permission android:name="android.permission.USB_PERMISSION" /> 
<uses-sdk android:minSdkVersion="12" /> 

<application> 
    <activity android:name=".USBActivity" 
     android:label="USBActivity" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

    <!--  <receiver android:name=".mUsbReceiver"> --> 

     <intent-filter> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
      <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> 
     </intent-filter> 

     <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
      android:resource="@xml/device_filter" /> 
     <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" 
      android:resource="@xml/device_filter" /> 
    <!--  </receiver> --> 

     </activity> 
</application> 

device_filter in res/xml, alle drei Einstellungen ausprobiert und ohne Verwendung:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <!-- iCooby mouse --> 
    <!--  <usb-device vendor-id="15d9" , /> --> 
    <!--  <usb-device vendor-id="5593" product-id="2637"/> --> 
    <usb-device /> 
</resources> 

Wenn jemand weiß, was passiert ist? oder sag mir, wie ich feststellen kann, ob die Broadcast-Absicht aktiv ist oder nicht, vielen Dank.

+0

Das hat mir geholfen: ** [Wie erhalten Sie USB-Verbindung Status Broadcast?] (Http://StackOverflow.com/Questions/39942453/How-To-Receive-USB-connection-Status-broadcast) ** –

Antwort

1

Das Empfänger-Tag ist auskommentiert, ich schätze, Sie wissen das, aber nur incase. Auch sollte es als <receiver android:name="mUsbReceiver"> deklariert werden, hat ein '.' das muss nicht dort sein

+0

danke für Ihre Erinnerung, ich versuche es vorher, aber das gleiche Ergebnis auch .. – user2645035

3

Vielleicht ein bisschen spät, aber es kann anderen helfen. Habe gerade ein ähnliches Problem mit der Erkennung von USB-Geräten gelöst. Es stellt sich heraus, dass - weil Sie eine Intent-Filter im Manifest angegeben - Android onResume ruft, wenn etwas angeschlossen ist Sie versuchen, dies könnte hinzufügen:

@Override 
protected void onResume() { 
    super.onResume(); 

    Intent intent = getIntent(); 
    if (intent != null) { 
     Log.d("onResume", "intent: " + intent.toString()); 
     if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { 
      // Do your thing ... 
     } 

dann auch Sie brauchen nicht die registerReceiver() Anruf in onCreate().. Beachten Sie auch, dass die IDs im Intent-Filter dezimal sind. Also müssten Sie die Werte wie in Befehlszeilen-Tools wie 'lsusb' dargestellt konvertieren.

+0

Vielen Dank! Löste mein Problem – breceivemail