꿈꾸는 시스템 디자이너

[번역] USB Accessory for Android(안드로이용 USB 악세사리) 본문

Development/Android

[번역] USB Accessory for Android(안드로이용 USB 악세사리)

독행소년 2012. 1. 2. 21:11

USB Accessory(USB 악세사리)

USB accessory mode allows users to connect USB host hardware specifically designed for Android-powered devices. The accessories must adhere to the Android accessory protocol outlined in the Android Accessory Development Kit documentation. This allows Android-powered devices that cannot act as a USB host to still interact with USB hardware. When an Android-powered device is in USB accessory mode, the attached Android USB accessory acts as the host, provides power to the USB bus, and enumerates connected devices. Android 3.1 (API level 12) supports USB accessory mode and the feature is also backported to Android 2.3.4 (API level 10) to enable support for a broader range of devices.

USB 악세사리 모드는 안드로이드-전원 장치를 위해 특별하게 설계된 USB 호스트 하드웨어를 연결하는 것을 허용한다. 이 악세사리들은 반드시 안드로이드 악세사리 개발 킷 문서에 서술된 안드로이드 악세사리 프로토콜을 가져야 한다. 이는 USB 호스트로 동작하지 못하는 안드로이드-전원 장치들이 USB 하드웨어와 상호작용할 수 있도록 한다. 안드로이드-전원 장치가 USB 악세사리 모드로 동작할 경우, USB 버스로 전원을 공급하고, 연결된 장치들을 열거한다. 안드로이드 3.1 (API 레벨 12)은 USB 악세사리 모드를 지원하고, 그 기능은 보다 많은 영역의 장치들을 위해 안드로이드 2.3.4(API 레벨 10) 부터 제공이 가능하다. (안드로이드 3.1부터 USB 악세사리 모드의 기능이 추가되었지만, 필드에 안드로이드 2.3.4 장치들이 많이 배포된 상황이기 때문에 에드온 라이브러리(external library) 형태로도 제공하여 필드에 배포된 안드로이드 장치에서도 USB 엑세사리를 이용할 수 있도록 하였다는 의미)

Choosing the Right USB Accessory APIs (USB 악세사리 API 권한 선택)

Although the USB accessory APIs were introduced to the platform in Android 3.1, they are also available in Android 2.3.4 using the Google APIs add-on library. Because these APIs were backported using an external library, there are two packages that you can import to support USB accessory mode. Depending on what Android-powered devices you want to support, you might have to use one over the other:
비록 USB 악세사리 API가 안드로이드 플랫폼 3.1부터 소개되었지만, 안드로이드 2.3.4 역시 구글 API 에드온 라이브러리를 통해 이용이 가능하다. 백포트(back-ported)된 API들이 외부 라이브러리를 이용하기 때문에, 당신이 USB 악세사리 모드를 이용하기 위해 임포트할 수 있는 두 패키지가 있다. 당신이 원하는 안드로이드-전원 장치가 어떤 것을 지원하는지에 따라, 아래의 둘 중에 하나를 선택해야 할 것이다.

  • com.android.future.usb: To support USB accessory mode in Android 2.3.4, the Google APIs add-on library includes the backported USB accessory APIs and they are contained in this namespace. Android 3.1 also supports importing and calling the classes within this namespace to support applications written with the add-on library. This add-on library is a thin wrapper around the android.hardware.usb accessory APIs and does not support USB host mode. If you want to support the widest range of devices that support USB accessory mode, use the add-on library and import this package. It is important to note that not all Android 2.3.4 devices are required to support the USB accessory feature. Each individual device manufacturer decides whether or not to support this capability, which is why you must declare it in your manifest file.
    com.android.future.usb:   안드로이드 2.3.4에서 USB 악세사리를 제공하기 위해, 구글 API 에드론 라이브러리는 백포트된 USB 악세사리 API들을 포함하고, 그들은 이 네임스페이스를 포함하고 있다. 안드로이드 3.1 역시 그 에드온 라이브러리를 가지고 작성된 어플리케이션을 지원하기 위해 이 네임스페이스를 가지는 클래스들을 임포트하고 호출하는 것을 지원한다. 이 에드온 라이브러리는 android.hardware.usb 악세사리 API들을 감싸는 얇은 랩퍼이고, USB 호스트 모드는 지원하지 않는다. 만약 당신이 USB 악세사리 모드를 지원하는 광범위한 장치들을 지원하기 원한다면, 에드온 라이브러리를 이용하고 이 패키지를 임포트하라. 모든 안드로이드 2.3.4 장치들이 USB 악세사리 기능을 지원하는 것을 만족하지는 않는다는 것을 알아야 한다. 각 개개 장치 제조사가 이 기능을 지원할지 여부를 결정하고, 그것이 너가 너의 메니페스트 파일에 정의해야하는 이유이다.
  • android.hardware.usb: This namespace contains the classes that support USB accessory mode in Android 3.1. This package is included as part of the framework APIs, so Android 3.1 supports USB accessory mode without the use of an add-on library. Use this package if you only care about Android 3.1 or newer devices that have hardware support for USB accessory mode, which you can declare in your manifest file.
    android.hardware.usb:  이 네이스페이스는 안드로이드 3.1에서 USB 악세사리 모드를 제공하는 클래스들을 포함한다. 이 패키지는 프레임워크 API의 일부로 포함되었으므로, 안드로이드 3.1은 에드온 라이브러리의 사용 없이도 USB 악세사리 모드를 지원한다. 만약 USB 악세사리 모드를 위해 사용하는 장치로 안드로이드 3.1 혹은 이보다 최신의 디바이스만을 고려한다면, 이 패키지를 이용하고, 그 사항을 당신의 메니페스트 파일내에 기술할 수 있다.
     

Installing the Google APIs add-on library(구글 API 에드온 라이브러리 설치)

If you want to install the add-on, you can do so by installing the Google APIs Android API 10 package with the SDK Manager. See Installing the Google APIs Add-on for more information on installing the add-on library.
만약 에드온의 설치를 원한다면, SDK 메니저를 통해 Google APIs Android API 10 패키지를 설치할 수 있다. 에드온 라이브러리 설치의 보다 많은 정보를 위해 Installing the Google APIs Add-on 문서를 살펴보라.

API Overview

Because the add-on library is a wrapper for the framework APIs, the classes that support the USB accessory feature are similar. You can use the reference documentation for the android.hardware.usb even if you are using the add-on library.
이 에드온 라이브러리는 프레임워크 API를 위한 랩퍼이기 때문에, USB 악세사리 기능을 제공하는 클래스들은 유사한다. 당신이 이 에드온 라이브러를 사용할지라도 android.hardware.usb를 위해 레퍼런스 문서를 이용할 수 있다. 

Note: There is, however, a minor usage difference between the add-on library and framework APIs that you should be aware of.
그럼에도 불고하고 에드온 라이브러리와 프레임워크 API간의 자잘한 사용의 차이점은 직접 인지해야 한다. 

The following table describes the classes that support the USB accessory APIs:
아래 테이블은 USB 악세사리 API를 지원하는 클래스들을 기술한다. 

ClassDescription
UsbManager Allows you to enumerate and communicate with connected USB accessories.
연결된 USB 악세사리들을 열거하고, 이들과 통신을 가능하게 한다.
UsbAccessory Represents a USB accessory and contains methods to access its identifying information.
USB 악세사리를 묘사하고 제어하기 위한 메소드들을 포함한다. 

Usage differences between the add-on library and platform APIs

There are two usage differences between using the Google APIs add-on library and the platform APIs.
구글 API 에드온 라이브러리와 플랫폼 API를 사용하는 것에는 두가지 사용상 차이점이 존재한다. 

If you are using the add-on library, you must obtain the UsbManager object in the following manner:
만약 에드온 라이브러리를 사용한다면, 반드시 아래 방식으로 UsbManager 객체를 구해야 한다.

UsbManager manager = UsbManager.getInstance(this);

If you are not using the add-on library, you must obtain the UsbManager object in the following manner:
만약 에드론 라이브러리를 사용하지 않는다면, 아래의 방식으로 UsbManager 객체를 구해야 한다. 

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

When you filter for a connected accessory with an intent filter, the UsbAccessory object is contained inside the intent that is passed to your application. If you are using the add-on library, you must obtain the UsbAccessory object in the following manner:
인텐트 필터를 가지고 연결된 악세사리를 선별할 때,  UsbAccessory 객체는 너의 어플리케이션으로 전달된 인텐트의 내부에 포함되어 있다. 만약 에드온 라이브러리를 이용한다면, 아래의 방식으로 UsbAccessory 객체를 구해야 한다.

UsbAccessory accessory = UsbManager.getAccessory(intent);

If you are not using the add-on library, you must obtain the UsbAccessory object in the following manner:
만약 에드온 라이브러리를 이용하지 않는다면, 아래의 방식으로 UsbAccessory 객체를 구해야 한다.

UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

Android Manifest requirements

The following list describes what you need to add to your application's manifest file before working with the USB accessory APIs. The manifest and resource file examples show how to declare these items:
아래의 리스트는 USB 악세사리 API를 통해 동작하기 전에 어플리케이션의 메니페시트 파일에 추가될 필요가 있는 것들을 기술한다.

  • Because not all Android-powered devices are guaranteed to support the USB accessory APIs, include a <uses-feature> element that declares that your application uses the android.hardware.usb.accessory feature.
    모든 안드로이드-전원 장치들이 USB 악세사리 모들을 지원하는 것을 보장하지 않기 때문에,
    android.hardware.usb.accessory 기능을 이용하는 너의 어플리케이션에   <uses-feature> 엘리먼트를 포함시켜라 
  • If you are using the add-on library, add the <uses-library> element specifying com.android.future.usb.accessory for the library.
    만약 에드온 라이브러리를 이용할 경우,  그 라이브러리를 위해  com.android.future.usb.accessory를 명세하는 <uses-library> 엘리먼트를 추가하라
  • Set the minimum SDK of the application to API Level 10 if you are using the add-on library or 12 if you are using the android.hardware.usb package.
    에드론 라이브러리를 이용하는 경우에는 10,  android.hardware.usb 패키지를 이용하는 경우에는 12의 API 레벨을 어플리케이션의 최소 SDK로 설정하라
  • If you want your application to be notified of an attached USB accessory, specify an <intent-filter> and <meta-data> element pair for the android.hardware.usb.action.USB_ACCESSORY_ATTACHED intent in your main activity. The <meta-data> element points to an external XML resource file that declares identifying information about the accessory that you want to detect.
    만약 당신의 어플리케이션이 연결된 USB 악세사리로 부터 통보 받도록 원한다면, 너의 메인 엑티비티 내의 android.hardware.usb.action.USB_ACCESSORY_ATTACHED 인텐트를 위해 <intent-filter> 와 <meta-data> 엘리먼트 쌍을 명세하라.  <meta-data> 엘리먼트는 당신이 감지하기를 원하는 악세사리와 관련된 식별 정보 정의하는 외부 XML 리소스 파일을 가르킨다.

    In the XML resource file, declare <usb-accessory> elements for the accessories that you want to filter. Each <usb-accessory> can have the following attributes:
    XML 리소스 파일내에는, 니가 필터링하고자 하는 악세사리를 위해 <usb-accessory> 앨리먼트를 정의하라. 각 <usb-accessory>는 아래와 같은 에트리뷰트를 가질 수 있다.

    • manufacturer
    • model
    • version

    Save the resource file in the res/xml/ directory. The resource file name (without the .xml extension) must be the same as the one you specified in the <meta-data> element. The format for the XML resource file is also shown in the example below.
    res/xml/ 디렉토리 내의 리소스 파일을 저장한다. 이 리소스 파일 이름 (.xml 확장자를 갖지 않음)은 <meta-data> 앨리먼트 에서 당신이 정의한 것과 동일한 이름을 가져야 한다.XML 리소스 파일이 포맷은 아래의 example가 보이고 있다.

Manifest and resource file examples(메니페스트와 리소스 파일의 예)

The following example shows a sample manifest and its corresponding resource file:
아래 예제는 간단한 메니페스트와 이와 연관된 리소스파일을 보이고 있다: 

<manifest ...>
   
<uses-feature android:name="android.hardware.usb.accessory" />
   
    <uses-sdk android:minSdkVersion="
<version>" />
    ...
   
<application>
     
<uses-library android:name="com.android.future.usb.accessory" />
       
<activity ...>
            ...
           
<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>

In this case, the following resource file should be saved in res/xml/accessory_filter.xml and specifies that any accessory that has the corresponding model, manufacturer, and version should be filtered. The accessory sends these attributes the Android-powered device:
이 경우에서, 아래의 리소스 파일은 res/xml/accessory_filter.xml로 저장되어야 하며 필터링 되야할 모델, 제조사, 버전을 가지는 어떤 악세사리를 명세한다. 이 악세사리는 이 에트리뷰트들을 안드로이드-전원 장치로 전달한다:

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

<resources>
   
<usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
</resources>

Working with Accessories(악세사리를 통한 동작)

When users connect USB accessories to an Android-powered device, the Android system can determine whether your application is interested in the connected accessory. If so, you can set up communication with the accessory if desired. To do this, your application has to:
유저들이 USB 악세사리를 안드로이드-전원 장치로 연결할 때, 안드로이드 시스템은 당신의 어플리케이션이 연결된 악세사리에 관심이 있는지를 결정할 수 있다. 만약 그렇다면, 당신은 원하는 그 악세사리와의 통신을 설정할 수 있다. 이를 위해서는, 당신의 어플리케이은 다음을 해야 한다.

  1. Discover connected accessories by using an intent filter that filters for accessory attached events or by enumerating connected accessories and finding the appropriate one.
    악세사리가 보내는 이벤트를 필터링하기 위한 인텐트 필터를 이용하거나 연결된 악세시리들의 목록을 이용해서 연결된 장치를 검색하고 적절한 장치를 찾는다.
  2. Ask the user for permission to communicate with the accessory, if not already obtained.
    해당 장치와 통신하기 위한 권한을 사용자에게 확인하고, 만약 권한이 준비되지 않았다면 획득한다. 
  3. Communicate with the accessory by reading and writing data on the appropriate interface endpoints.
    적절한 인터페이스의 엔드포인트들을 이용하여 읽고 쓰기를 통해 해당 악세사리와 통신힌다. 

Discovering an accessory(악세사리 검색)

Your application can discover accessories by either using an intent filter to be notified when the user connects an accessory or by enumerating accessories that are already connected. Using an intent filter is useful if you want to be able to have your application automatically detect a desired accessory. Enumerating connected accessories is useful if you want to get a list of all connected accessories or if your application did not filter for an intent.
당신의 어플리케이션은  유저가 악세사리를 연결할때 통보 받기 위해 인텐트 필터를 이용하거나 이미 연결된 악세사리들의 목록을 통해서 악세사리들을 검색할 수 있다. 인텐트 필터를 이용하는 것은 당신의 어플리케이션이 원하는 악세사리를 자동으로 감지해야 할 때 유용하다. 연결된 악세사리의 목록은 연결된 악세사리들의 목록을 얻거나 당신의 어플리케이션이 하나의 인텐트를 필터리하지 않는 경우에 유용하다.

Using an intent filter(인테트 필터 사용)

To have your application discover a particular USB accessory, you can specify an intent filter to filter for the android.hardware.usb.action.USB_ACCESSORY_ATTACHED intent. Along with this intent filter, you need to specify a resource file that specifies properties of the USB accessory, such as manufacturer, model, and version. When users connect an accessory that matches your accessory filter,
당신의 어플리케이션이 특정한 USB 악세사리를 감지하기 위해서, 당신은
android.hardware.usb.action.USB_ACCESSORY_ATTACHED 인텐트를 필터링하기 위해 하나의 인텐트 필터를 명세할 수 있다. 이 인텐트 필터를 따라서, 당신은 제조사, 모델, 그리고 버전과 같은 그 장치의 특징을 명세하는 리소스 파일을 명세할 필요가 있다. 유저가 악세사리를 연결할때 당신의 악세사리 필터와 매칭된다.

The following example shows how to declare the intent filter:
아래의 예는 어떻게 인텐트 필터를 정의하는지를 보인다: 

<activity ...>
    ...
   
<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>

The following example shows how to declare the corresponding resource file that specifies the USB accessories that you're interested in:
아래 예제는 당신이 관심을 갖고 있는 USB 악세사리들을 명세하는 관련 리소스 파일을 어떻게 정의하는지를 보인다.
 

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

<resources>
   
<usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" />
</resources>

In your activity, you can obtain the UsbAccessory that represents the attached accessory from the intent like this (with the add-on library):
당신의 엑티비티에서, 당신은 (에드온 라이브러리를 통해) 이와 같은 인텐트로부터 연결된 악세사리를 묘사하는 UsbAccessory를 획득할 수 있다. 

UsbAccessory accessory = UsbManager.getAccessory(intent);

or like this (with the platform APIs):
아니면 (플랫폼 API를 통해) 이와 같이:

UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

Enumerating accessories(악세사리들의 목록)

You can have your application enumerate accesories that have identified themselves while your application is running.
당신은 당신의 어플리케이션이 동작하는 동안 그들 스스로 식별된 악세사리들을 목록화하는 어플리케이션을 가질 수 있다.

Use the getAccessoryList() method to get an array all the USB accessories that are connected:
연결된 모든 USB 악세사리들의 목록을 구하기 위해 getAccessoryList() 메소드를 사용하라

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory[] accessoryList = manager.getAcccessoryList();

Note: Currently, only one connected accessory is supported at one time, but the API is designed to support multiple accessories in the future.
현재, 한번에 오직 하나의 연결된 악세사리만을 지원한다. 그러나 이 API는 앞으로 복수의 악세사리들을 지원할 수 있도록 설계되었다.

Obtaining permission to communicate with an accessory(악세사리와의 통신을 위한 권한 획득)

Before communicating with the USB accessory, your applicaton must have permission from your users.
USB 악세사리와의 통신 전에, 당신의 어플리케이션은 당신의 사용자로부터 권한을 가져야 한다. 

Note: If your application uses an intent filter to discover accessories as they're connected, it automatically receives permission if the user allows your application to handle the intent. If not, you must request permission explicitly in your application before connecting to the accessory.
만약 악세사리들이 연결되었을 때 당신의 어플리케이션이 악세사리 검색을 위해 intent filter를 이용한다면, 사용자가 인텐트를 핸들하기 위해 당신을 어플리케이션을 허락한다면 자동으로 권한을 받을 것이다. 만약 아니라면, 당신은 악세사리로 연결하기 전에 당신의 어플리케이션에서 명확하게 권한을 요청해야만 한다.

Explicitly asking for permission might be neccessary in some situations such as when your application enumerates accessories that are already connected and then wants to communicate with one. You must check for permission to access an accessory before trying to communicate with it. If not, you will receive a runtime error if the user denied permission to access the accessory.
당신의 어플리케이션이 이미 연결된 악세사리들을 열거하거나 그래서 그 중 하나와 통신을 원할 경우와 같은 몇몇의 상황에서 명시적인 권한 요청이 필요할 것이다. 당신은 악세사리와 통신을 시도하기 전에 악세사리를 접근하기 위한 권한을 확인해야한다. 그렇지 않으면, 사용자가 그 악세사리를 접근하기 위한 권한을 거부한다면 런타임 에러가 발생하게 될 것이다.

To explicitly obtain permission, first create a broadcast receiver. This receiver listens for the intent that gets broadcast when you call requestPermission(). The call to requestPermission() displays a dialog to the user asking for permission to connect to the accessory. The following sample code shows how to create the broadcast receiver:
명확한 권한 획득을 위해, 첫째 브로트 캐스트 리시버를 획득한다. 이 리시버는 당신이 requestPermission()를 호출할때 브로드캐스트되는 인텐트를 듣는다. 사용자의 악세사리 접속을 위한 권한 요청을 위한 다이얼로그를 표시하기 위해 requestPermission()를 호출한다. 아래의 샘플 코드는 어떻게 브로드캐스트 리시버를 생성하는지를 보인다.

private static final String ACTION_USB_PERMISSION =
   
"com.android.example.USB_PERMISSION";
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
 
   
public void onReceive(Context context, Intent intent) {
       
String action = intent.getAction();
       
if (ACTION_USB_PERMISSION.equals(action)) {
           
synchronized (this) {
               
UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

               
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                   
if(accessory != null){
                       
//call method to set up accessory communication
                   
}
               
}
               
else {
                   
Log.d(TAG, "permission denied for accessory " + accessory);
               
}
           
}
       
}
   
}
};

To register the broadcast receiver, put this in your onCreate() method in your activity:
브로드캐스트 리시버를 등록하기 위해, 이것을 당신의 엑티비티내의 onCreate()메소드에 넣어라:

UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
private static final String ACTION_USB_PERMISSION =
   
"com.android.example.USB_PERMISSION";
...
mPermissionIntent
= PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver
(mUsbReceiver, filter);

To display the dialog that asks users for permission to connect to the accessory, call the requestPermission() method:
악세사리에 접속하기 위한 권한을 사용자에게 요청하는 다이얼로그를 표시하기 위해,  requestPermission() 메소드를 호출한다:

UsbAccessory accessory;
...
mUsbManager
.requestPermission(accessory, mPermissionIntent);

When users reply to the dialog, your broadcast receiver receives the intent that contains the EXTRA_PERMISSION_GRANTED extra, which is a boolean representing the answer. Check this extra for a value of true before connecting to the accessory.
사용자가 다이얼로그에 응답할 때, 당신의 브로드캐스트 리시버는 EXTRA_PERMISSION_GRANTED 엑스트라에 포함된 인텐트를 수신하고, 이는 boolean 형태의 응답이다. 악세사리에 접속하기 전에 실제 값을 위해 엑스트라를 확인한다. 

Communicating with an accessory(악세사리와의 통신)

You can communicate with the accessory by using the UsbManager to obtain a file descriptor that you can set up input and output streams to read and write data to descriptor. The streams represent the accessory's input and output bulk endpoints. You should set up the communication between the device and accessory in another thread, so you don't lock the main UI thread. The following example shows how to open an accessory to communicate with:
당신은 디스크립터 데이터를 읽고 쓰기 위한 인풋 아웃풋 스트림을 설정할 수 있는 파일 디스크립터를 획득하기 위해 UsbManager를 이용함으로써 악세사리와 통신을 할 수 있다. 이 스트림들은 그 악세사리의 인풋 아웃풋 벌크 앤드포인트를 묘사한다. 당신은 또다른 쓰레드에서 디바이스와 악세사리간의 통신을 설정해야하며, 그래서 당신은 메인 UI 쓰레드를 잠그지 않는다. 아래 예제는 통신을 위한 악세사리를 어떻게 오픈하는지를 보인다. 

UsbAccessory mAccessory;
ParcelFileDescriptor mFileDescriptor;
FileInputStream mInputStream;
FileOutputStream mOutputStream;

...

private void openAccessory() {
   
Log.d(TAG, "openAccessory: " + accessory);
    mFileDescriptor
= mUsbManager.openAccessory(mAccessory);
   
if (mFileDescriptor != null) {
       
FileDescriptor fd = mFileDescriptor.getFileDescriptor();
        mInputStream
= new FileInputStream(fd);
        mOutputStream
= new FileOutputStream(fd);
       
Thread thread = new Thread(null, this, "AccessoryThread");
        thread
.start();
   
}
}

In the thread's run() method, you can read and write to the accessory by using the FileInputStream or FileOutputStream objects. When reading data from an accessory with a FileInputStream object, ensure that the buffer that you use is big enough to store the USB packet data. The Android accessory protocol supports packet buffers up to 16384 bytes, so you can choose to always declare your buffer to be of this size for simplicity.
run() 메소드내에서, 당신은 FileInputStream과 FileOutputStream을 이용함으로써 해당 악세사리를 일고 쓸 수 있게 된다. FileInputStream 객체를 가지고 악세사리로부터 데이터를 읽을 경우, 당신이 사용하는 버퍼는 USB 패킷 데이터를 저장하기에 충분한 크기를 보장한다. 안드로이드 악세사리 프로토콜은 16384 바이트 이상의 패킷 버퍼를 제공하므로, 편리함을 위해 당신은 당신의 버퍼가 이 크기가 되도록 항상 정의할 수 있다.

Note: At a lower level, the packets are 64 bytes for USB full-speed accessories and 512 bytes for USB high-speed accessories. The Android accessory protocol bundles the packets together for both speeds into one logical packet for simplicity.
하위 계층에서, USB 풀 스피드 악세사리를 위한 패킷은 64바이트이고, USB 고속 악세사리를 위한 패킷은 512바이트이다. 편의성을 위해 안드로이드 악세사리 프로토콜은 두 속도를 하나의 논리적 패킷으로 묶었다.

For more information about using threads in Android, see Processes and Threads.
안드로이드에서 쓰레드를 이용하기 위한 보다 많은 정보를 위해서는, Processes and Threads를 봐라.

Terminating communication with an accessory(악세사리와의 통신 종료)

When you are done communicating with an accessory or if the accessory was detached, close the file descriptor that you opened by calling close(). To listen for detached events, create a broadcast receiver like below:
당신이 악세사리와 통신을 완료하거나 악세사리가 제거된 경우에는,  close()를 호출하여 당신이 오픈한 파일 디스크립터를 닫는다. 접속해제 이벤트를 감지하기 위해서는, 아래와 같은 브로드캐스트 리시버를 생성한다:

BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
   
public void onReceive(Context context, Intent intent) {
       
String action = intent.getAction();

       
if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
           
UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
           
if (accessory != null) {
               
// call your method that cleans up and closes communication with the accessory
           
}
       
}
   
}
};

Creating the broadcast receiver within the application, and not the manifest, allows your application to only handle detached events while it is running. This way, detached events are only sent to the application that is currently running and not broadcast to all applications.
브로드캐스트 리시버를 어플리케이션에는 생성하고, 메니페스트에 생성하지 않으면, 당신의 어플리케이션이 동작하는 중에만 접속해제 이벤트를 처리할 수 있게된다. 이 방법은, 접속해제 이벤트가 현재 동작중인 어플리케이션에게만 전달되고 모든 어플리케이션으로 브로드캐스트 되지 않는다.

Comments