2014-04-28 1 views
3

내가 안드로이드 스튜디오 0.5.2를 사용하여 안드로이드 응용 프로그램을 개발하고있다 "중지안드로이드 USB 권한, onPause, onResume -. 불행하게도, 시스템 UI가

제대로 작동 나타나는 USB 호스트를 운영하고 내 응용 프로그램 -하지 않는 한 응용 프로그램이 시작될 때 장치가 연결되어있는 (그리고 권한이 아직 부여되지 않은)

을 일반적으로 USB가 연결되어있을 때 어떤 일이 발생 (응용 프로그램이 실행되는 동안) :

  • 는 "onResume은"

    라고 -. 이 장치를 감지하고 권한을 요청합니다. . 인 텐트 필터가 USB가 연결 분리 또는 권한

  • 권한 요청이 표시됩니다 부여 될 때 잡을 생성,

  • 는 "onResume는"다시 호출 확인을 선택합니다. 이 funciton의 첫 번째 줄은 "super.onResume()"최대한 빨리 super.onResume에 걸쳐 단계로

  • , 메시지가 표시됩니다 "불행하게도, 시스템 UI가 중지되었습니다"안드로이드 UI는

  • 충돌 내 응용 프로그램이 계속 올바르게 작동합니다.

응용 프로그램이 이미 실행 중일 때 장치를 연결하면 문제가 없습니다. 이는 USB가 시작될 때만 발생합니다.

문제의 원인을 파악할 수있는 방법이나 문제를 더욱 좁히는 방법에 대한 통찰력이 있으면 크게 감사하겠습니다. 아래에 주목할만한 코드를 첨부했습니다. 나는 정상적으로 Java 개발자가 아니므로이 문제는 일시 중지/다시 시작 동작, 수신자, 의도 필터 또는 사용 권한과 관련이 있다고 의심됩니다. 장치가 연결되지 않은 경우

// ************************************************************* 
// ************************* USB Stuff ************************* 
// ************************************************************* 
boolean resumePermissionBlocked = false; 
PendingIntent pendingIntent = null; 
BroadcastReceiver receiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     // Get the information about what action caused this event 
     try { 
      String action = intent.getAction(); 
      Log.i(TAG, "$EC: action:" + action); 

      if ("com.android.example.USB_PERMISSION".equals(action)) { 
       UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

       if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        if (device != null) { 


         if (device.getProductId() == 0xAAAA) { 
          if (device.getVendorId() == 0xBBBB) { 
           // see if we have permission 
           UsbManager openManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 

           // send a message to the worker thread to begin opening a connection to this device 
           ThreadMsg msg = new ThreadMsg(); 
           msg.request = MsgRequest.openConnection; 
           msg.objectA = device; 
           msg.objectB = openManager; 
           sendMessageToWorker(msg); 

          } 
         } 
        } 
       } else { 
        if (device != null) 
         Log("USB Permission denied", TextFormat.StrongWarning_withTime); 
       } 
      } 
      if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { 
       UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
       if (device == null) return; 
       if (device.getProductId() == 0x003C) { 
        if (device.getVendorId() == 0x04D8) { 
         // see if we have permission 
         UsbManager openManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 
         if (!openManager.hasPermission(device)) { 
          resumePermissionBlocked = true; // block the resume function from trying to re-ask for permission 
          openManager.requestPermission(device, mPermissionIntent); 
          return; 
         } 
         ThreadMsg msg = new ThreadMsg(); 
         msg.request = MsgRequest.openConnection; 
         msg.objectA = device; 
         msg.objectB = openManager; 
         sendMessageToBootloader(msg); 
        } 
       } 
      } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 
       // If it was a USB device detach event, then get the USB device 
       // that caused the event from the intent. 
       UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

       ThreadMsg msg = new ThreadMsg(); 
       msg.request = MsgRequest.closeConnection; 
       msg.objectA = device; 
       sendMessageToBootloader(msg); 
      } 
     } catch (Exception e) { 
      Log.i(TAG, "onResume catch: " + e.toString()); 
     } 
    } 

}; 

boolean receiverHasBeenRegistered = false; 

PendingIntent mPermissionIntent; 
@Override 
public void onResume(){ 
    try { 

     super.onResume(); 

     if (resumePermissionBlocked) { 
      // this was resumed from a permission request - don't try to connect to the device now, leave it for the USB_PERMISSION_GRANTED intent 
      resumePermissionBlocked = false; // clear the flag 
     } else { 
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 
      HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); 
      if (deviceList != null) { 
       Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
       Log.i(TAG, "$EC: Begin iteration"); 

       while (deviceIterator.hasNext()) { 
        // Is this the device we are after? 
        UsbDevice device = deviceIterator.next(); 
        if (device == null) return; 
        if (device.getProductId() == 0xAAAA) { 
         if (device.getVendorId() == 0xBBBB) { 
          // see if we have permission 
          UsbManager openManager = (UsbManager) this.getSystemService(Context.USB_SERVICE); 
          if (!openManager.hasPermission(device)) { 
           resumePermissionBlocked = true;   // block the subsequent call to this (between the application resuming and permission being granted) 
           openManager.requestPermission(device, mPermissionIntent); 
           return; 
          } 
          ThreadMsg msg = new ThreadMsg(); 
          msg.request = MsgRequest.openConnection; 
          msg.objectA = device; 
          msg.objectB = openManager; 
          sendMessageToWorker(msg); 
         } 
        } 
       } 
      } 
     } 
    } catch (Exception e) 
    { 
     Log.i(TAG, "onResume catch: " + e.toString()); 
    } 

    if (!receiverHasBeenRegistered) { 
     // this line is for permissions 
     mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.android.example.USB_PERMISSION"), 0); 

     //Create a new filter to detect USB device events 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
     filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
     filter.addAction("com.android.example.USB_PERMISSION"); 
     registerReceiver(receiver, filter); 
     pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(getPackageName() + ".USB_PERMISSION"), 0); 
     receiverHasBeenRegistered = true; 
    } 
} 

@Override 
public void onPause() { 
    /* unregister any receivers that we have */ 
    try { 
     if (receiver != null && receiverHasBeenRegistered) { 
      unregisterReceiver(receiver); 
      receiverHasBeenRegistered = false; 
     } 
    } catch (Exception e) { 
     // if this happens, then the receiver was probably never registered in the first place 
     Log.i(TAG, "onPause catch: " + e.toString()); 
    } 
    super.onPause(); 
} 

답변

0
  1. , 어플리케이션 시작 (주요 활동의 에서 onCreate)에 USB 장치를 연결
  2. 경고 사용자 onResume 방법의 끝에서 경고 MSG 및 마무리 토스트 super.onResume 사용해/닫기 UI를 메시지 정지 할 때
  3. 추가 앱이 예외 printstacktrack를 캡처 장치
  4. 시도를 연결 자동으로 시작 할 수 있도록 매니페스트 파일에서 필터를하고자하는 주요 활동은입니다이 표시되고 예외에서 추가로 디버그됩니다.
  5. 은 안드로이드 문서에서 단계를 수행해야합니다 https://developer.android.com/guide/topics/connectivity/usb/host.html