꿈꾸는 시스템 디자이너

Android 악세사리 디스크립터 생성 및 적용 본문

Development/Android

Android 악세사리 디스크립터 생성 및 적용

독행소년 2012. 1. 11. 11:35
아두이노 ADK를 이용한 안드로이드 악세사리 개발에서 악세사리의 디스크립터를 생성하는 법은 다음과 같다.

 ...
AndroidAccessory acc("Google, Inc.",
                    
"DemoKit",
                    
"DemoKit Arduino Board",
                    
"1.0",
                     "http://www.adnroid.com/
",
                     "0000000012345678");
...

void loop()
{
...
   
if (acc.isConnected()) {
       
//communicate with Android application
   
}
   
else{
       
//set the accessory to its default state
   
}
...
}

위와 같이 acc를 구현하고 loop()함수내에서 악세사리가 수행해야할 동작을 구현하는 것이다.
다음과 같은 예로 악세사리 코드(펌웨어)를 구현해 보았다.

 AndroidAccessory acc("H4U",                                     //제조사 명
                                  "ADK",                                     //제품 모델명
                                  "H4U ADK Testboard",               //제품 설명
                                  "1.0",                                       //제품 버전   
                                  "http://here4you.tistory.com",    //제품 URI
                                  "0000000012345678");                 //제품 시리얼 번호 

이 상태에서 장치를 폰에 연결하면 다음과 같은 화면이 나타난다. 위에서 정의한 디스크립션의 내용이 아래에 어떻게 적용되는지 확인 가능하다.

 

위와 같은 메시지가 나온 이유는 악세사리로부터 읽어온 디스크립터에 해당하는 앱이 아직 설치되지 않았기 때문이다. 이 악세사리와 통신할 앱을 개발하기 위해서는 메니페스트파일과 리소스 XML파일의 정의가 필요하다. 메니페스트파일은 다음과 같이 정의한다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.etri.adk"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="11" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <!-- 악세사리 API 사용 선언 -->
        <uses-library android:name="com.android.future.usb.accessory" />

        <activity
            android:label="@string/app_name"
            android:name=".AdkTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- USB 악세사리가 폰에 연결될때 그 이벤트를 받기 위한 인텐트 필터 선언 -->
            <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" />

        </activity>
    </application>

</manifest>


특히 위에서 정의한 메니페스트 파일의 내용 중에 메타 데이터에 관련된 부분을 보면 xml/accessory_filter를 리소스로 사용하겠다고 정의하였다. 그러므로 res 디렉토리 밑에 xml 디렉토리를 새로 생성하고 그 안에 accessory_filter.xml 파일을 새롭게 생선하고 아래와 같이 정의한다. 아래와 같은 제조사와 모델명, 그리고 버전이 일치하는 악세사리의 디스크립터가 수신되면 해당 악세사리를 본 앱으로 연결해 달라는 것을 정의하는 것이다.

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

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


앞서 설명한 메니페스트파일과 xml리소스파일을 이용하여 개발한 apk파일을 폰에 설치한 후 폰을 악세사리와 연결하면 다음과 같이 연관된 앱을 실행할지 여부를 사용자에게 묻는 다이얼로그가 나타난다.
 


클릭해 주시면 제가 기분이 좋습니다.
 

Comments