2016-08-24 2 views
-1

J'utilise un récepteur USB pour gérer la communication avec un capteur de température relié par USB au téléphone. Tout fonctionne correctement jusqu'à maintenant, mais si je redémarre le téléphone, l'application lance une fenêtre d'autorisation USB directement après avoir redémarré, même si aucun périphérique USB n'est connecté au téléphone. Moment. Est-ce que quelqu'un a une idée de ce qui cause cet étrange problème? Je suis désolé, l'application ne demande pas l'autorisation USB, le popup demande si je veux ouvrir l'application si "cet appareil est connecté" mais il n'y a évidemment aucun périphérique attaché. ]L'application demande la permission USB à chaque redémarrage du téléphone

Voici le code de l'USB-récepteur:

//Initial USB Settings Receiver 
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     final String action = intent.getAction(); 

     if (ACTION_USB_PERMISSION.equals(action)) { 
      synchronized (this) { 
       final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

       // is usb permission has been granted, try to open a connection 
       if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        if (device != null) { 
         // call method to set up device communication 
         Constants result = mcp2221.open(); 

         if (result != Constants.SUCCESS) { 
          //nothing by now 
         } else { 
          openConnectionToMCP2221(); 
         } 
        } 
       } 
      } 
     } 

     if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 
      // close the connection and release all resources 
      closeAllResources(); 
      // leave a bit of time for the COM thread to close 
      try { 
       Thread.sleep(20); 
      }catch(InterruptedException e){e.printStackTrace();} 
      mcp2221Comm = null; 
      Toast.makeText(getApplicationContext(), "Device detached", 
        Toast.LENGTH_SHORT).show(); 
     } 

     if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { 
      final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
      if (device != null) { 
       Toast.makeText(getApplicationContext(), "Device attached", 
         Toast.LENGTH_SHORT).show(); 
       mStopUSBThread=false; 

       // only try to connect if an MCP2221 is attached 
       if (device.getVendorId() == MCP2221_VID && device.getProductId() == MCP2221_PID) { 
        Constants result = mcp2221.open(); 

        switch (result) { 
         case SUCCESS: 
          openConnectionToMCP2221(); 
          break; 
         case CONNECTION_FAILED: 
          Toast.makeText(getApplicationContext(), "ERROR: connection failed", Toast.LENGTH_SHORT).show(); 
          break; 
         case NO_USB_PERMISSION: 
          Toast.makeText(getApplicationContext(), "ERROR: no USB permission", Toast.LENGTH_SHORT).show(); 
          mcp2221.requestUsbPermission(mPermissionIntent); 
          break; 
         default: 
          break; 
        } 
       } 
      } 
     } 

    } 
}; 

Et voici la partie onCreate():

//USB Connection 
    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
    final IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 

    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
    registerReceiver(mUsbReceiver, filter); 
    //Checking if theres a Device already connected 
    ....... 
+0

Du code de votre application peut-être? Avez-vous un récepteur 'android.intent.action.BOOT_COMPLETED'? – maciekjanusz

+0

Je vais ajouter du code. Non, je ne vérifie qu'un appareil connecté une fois au démarrage de l'application, juste au cas où le capteur est déjà connecté, puis le récepteur USB écoute les appareils ATTACHÉS et DÉTACHÉS et demande une autorisation une fois. – TheStriker0815

Répondre

0

Got it! Ce fut un

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

qui a été déclaré dans AndroidManifest.xml sous <activity>.

Je ne comprends pas complètement, pourquoi il a causé ce bogue, mais en le supprimant gardé la fonctionnalité de mon application tout en se débarrassant du problème.

Seul l'aspect «négatif» pourrait être, que maintenant l'application ne demande pas à ouvrir si le capteur est connecté au téléphone.