2013-08-02 27 views
8

sto codifica un host USB App di recente, ma è stucked perché non riesco a rilevare l'allegato/evento indipendente dispositivo, ho seguito la nota codifica di http://developer.android.com/guide/topics/connectivity/usb/host.html e fare riferimento alla codifica degli altri nella rete, dopo aver controllato più volte, non riesco ancora a trovare il problema. Dopo il debug, sembra che l'intento UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED non sia successo, perché provo a usare Context.sendBroadcast() per inviare un Intent personalizzato, e il mio BroadcastReceiver può ricevere l'intento. Ma quando collego/scollego il dispositivo USB, BroadcastReceiver non funziona. Il cellulare che uso è HTC One-X, sono sicuro che la funzione OTG è corretta poiché la funzione del mouse funziona perfettamente. Ecco il mio pezzo di codice.Non è possibile ricevere trasmissioni scopo dei 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); 

} 

Il 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, tutti i 3 impostazioni sono provati e non-uso:

<?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> 

Se qualcuno sa cosa è successo? o dimmi come rilevare se l'intento di trasmissione è attivo o no, grazie mille.

+0

Questo mi ha aiutato: ** [Come ricevere la trasmissione dello stato della connessione USB?] (Http://stackoverflow.com/questions/39942453/how-to-receive-usb-connection-status-broadcast) ** –

risposta

1

Il tag del ricevitore è commentato, immagino che tu lo sappia, ma solo incassare. Inoltre dovrebbe essere dichiarato come <receiver android:name="mUsbReceiver"> il tuo ha un '.' che non ha bisogno di essere lì

+0

grazie per il tuo ricordo, ci provo prima, ma lo stesso risultato anche .. – user2645035

3

Forse un po 'tardi, ma può aiutare gli altri. Ho appena risolto un problema simile con il rilevamento dell'inserimento di dispositivi USB. Si scopre che - in quanto si è specificato un filtro intento nel manifesto - Android chiama onResume quando qualcosa è collegato Si potrebbe provare ad aggiungere questo:

@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 ... 
     } 

allora anche voi non hanno bisogno del registerReceiver() chiamata in onCreate().. Tieni anche presente che gli ID nel filtro intent sono in decimale. Quindi dovresti convertire i valori come presentati da strumenti da riga di comando come 'lsusb'.

+0

Grazie! Risolto il mio problema – breceivemail