꿈꾸는 시스템 디자이너

엑티비티에서 ACTION_USB_ACCESSORY_ATTACHED 액션 받기에 관한 고찰 본문

Development/Android

엑티비티에서 ACTION_USB_ACCESSORY_ATTACHED 액션 받기에 관한 고찰

독행소년 2012. 1. 13. 14:58
USB 악세사리가 폰에서 연결되고 해제되는 것을 모니터링 하는 엑티비티를 만들어 보고 싶어서 아래의 작업을 수행했다.

1. 메니페스트 파일

        <activity 

            android:label="@string/app_name"

            android:name=".ConnectionManager"

            android:launchMode="singleTop">

            <intent-filter>

                <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>

            </intent-filter>

            <meta-data

                android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"

                android:resource="@xml/accessory_filter"/>

            <intent-filter >

                <action android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED"/>

            </intent-filter>

            <meta-data

                android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED"

                android:resource="@xml/accessory_filter"/>

        </activity>

 
2. 리소스 파일

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <usb-accessory manufacturer="H4U" model="ADK" version="1.0" />

</resources>

 
3. 엑티비티 파일

public class ConnectionManager extends Activity{


@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

}


@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

IntentFilter filter = new IntentFilter();

filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);

filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);

registerReceiver(br,filter);

}

BroadcastReceiver br = new BroadcastReceiver(){


int count = 0;

String action, str;

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

count++;

action = intent.getAction();

Toast.makeText(context, count + action, Toast.LENGTH_LONG).show();

}

};

}

 
위와 같이 코딩하고, USB악세사리가 연결되고 해제될때마다 토스트가 발생하기를 기대했는데, 해제에 의한 인텐트는 잘 날라오는데, 연결에 의한 인텐트는 날라오질 않는다.

분명 인텐트필터에 액션을 추가했음에도 날라오지 않는게 이상해서 한참 고민을 해봤는데...

결론은,  UsbManager.ACTION_USB_ACCESSORY_ATTACHED 은 엑티비티에서 사용하는게 아니라 안드로이드 시스템이 사용하기 위해 정의된 것이라고 판단된다.

메니페스트파일에서  USB_ACCESSORY_ATTACHED 인텐트 필터를 정의하고 리소스파일을 정의하는 이유는 분명 내가 원하는 특정 장치가 접속되었을 때 어떤 작업을 수행하기 위해서 있다. 그러므로 여기까지는 필요한 작업이다.

안드로이드 시스템이 동작하는 중에 내가 원하는 USB 악세사리가 접속되면, 안드로이드는 해당 USB 장치의 디스크립터를 읽어서 파싱할 것이고, 이 장치와 통신할 엑티비티를 찾아서 실행 시켜줄 것이다. 즉  USB_ACCESSORY_ATTACHED 액션은 이 액션을 등록한 엑티비티를 찾아서, 그 엑티비티를 실행시키는데 사용되버리는 것이다. 즉 이 인텐트는 안드로이드 시스템이 사용해 버렸기 때문에 실행되는 엑티비티로 전달되지 않는다고 판단된다.

요약하면, 엑티비티내에서  UsbManager.ACTION_USB_ACCESSORY_ATTACHED를 정의할 필요도, 사용할 방법도 없어 보인다.

눌러주시면, 제가 기분이 좋습니다.

 
Comments