2013-08-02 1 views
8

, 내가 http://developer.android.com/guide/topics/connectivity/usb/host.html의 코딩 노트를 따라 네트워크에서 다른 사람의 코딩을 참조하십시오. 여러 번 확인한 후에도 문제를 찾을 수 없습니다. 내 디버깅 후 UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED 의도는 발생하지 않았습니다. Context.sendBroadcast()를 사용하여 사용자 정의 된 Intent를 보내려고하고 내 BroadcastReceiver가 Intent를 수신 할 수 있기 때문입니다. 그러나 USB 장치를 장착/분리 할 때 BroadcastReceiver가 실행되지 않습니다. 내가 사용하는 핸드폰은 HTC One-X입니다. 마우스 기능이 완벽하게 작동하는 것처럼 OTG 기능이 정확하다고 확신합니다. 여기 내 코드 조각입니다.이 UsbManager.ACTION_USB_DEVICE_ATTACHED의 방송 의도를 수신 할 수 없음/UsbManager.ACTION_USB_DEVICE_DETACHED 내가 최근에 USB 호스트 응용 프로그램을 코딩하고,하지만 난 장치 부착/분리 이벤트를 감지 할 수 있기 때문에 stucked의

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

} 

브로드 캐스트 리시버

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 고해상도/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는 3 설정이 시도되지 않고 사용 :

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

어떤 일이 일어 났는지 아는 사람이 있습니까? 또는 방송의 의도가 활성인지 아닌지를 감지하는 방법을 알려주십시오. 대단히 감사합니다.

+0

이 나를 도와 : ** [? 어떻게 USB 연결 상태 방송을 수신하기 위해 (http://stackoverflow.com/questions/39942453/how-to-receive-usb-connection-status-broadcast) ** –

답변

1

받는 사람 태그가 주석 처리되었으므로 나는 알고 있다고 생각하지만 그냥 넣으면됩니다. 또한 그것은 <receiver android:name="mUsbReceiver">으로 선언되어야합니다. 거기에있을 필요가 없습니다

+0

감사 당신의 생각 나게하기 위해, 나는 전에 그것을 시험해 본다. 그러나 같은 결과도. – user2645035

3

아마도 조금 늦었 겠지만 다른 사람들에게 도움이 될 수 있습니다. 그냥 USB 장치의 삽입 감지와 비슷한 문제를 해결. 그것은이 밝혀 - 당신이 매니페스트에 인 텐트 필터를 지정했기 때문에 - 뭔가에 연결하면 안드로이드가 onResume 호출이 추가 시도 할 수 있습니다 :

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

그런 다음 당신은 또한 onCreate()에서 registerReceiver() 전화가 필요하지 않습니다.. 인 텐트 필터의 ID는 십진수입니다. 따라서 'lsusb'와 같은 명령 행 도구로 제시된 값을 변환해야합니다.

+0

고마워! 내 문제를 해결했다. – breceivemail