USB部品の概要

9103 ワード

  • 適切なUSBアクセサリAPI
  • を選択
  • API概要
  • usb添付ファイル通信フロー
  • 添付ファイル
  • を発見
  • 通信権限
  • を取得する.
  • 添付ファイルとの通信
  • 添付ファイルとの通信を切断する
  • .




    USBアクセサリモードでは、Androidデバイス用に設計されたUSBホストハードウェアに接続できます.AndroidデバイスがUSBアクセサリモードの場合、付属のAndroid USBアクセサリがホストとして機能し、USBバスに電力を供給し、接続されたデバイスを列挙します.
    添付ファイルはAndroid添付ファイル開発キットドキュメント(https://source.android.com/devices/accessories/)で概説したAndroid添付ファイルプロトコル.これにより、USBホストとして機能しないAndroid電源装置がUSBハードウェアと対話できるようになります.
    適切なUSBアクセサリAPIを選択
    Android 3.1(APIレベル12)はUSBアクセサリモードをサポートし、この機能はAndroid 2.3.4(APIレベル10)にも後方移植され、より広範なデバイスをサポートする.Android 2.3.4のUSBアクセサリモードはGoogle APIアクセサリを使用する必要がありますcom.android.future.usbパッケージ;Android 3.1プラットフォームでhardware.usbパッケージ.
    APIの概要
    class
    Description
    UsbManager
    接続されたUSBアクセサリを列挙して通信できます.
    UsbAccessory
    USB添付ファイルを表し、その識別情報にアクセスする方法を含む.
    注意:Googleの追加ライブラリとプラットフォームAPIの使用の違い
    usb添付ファイル通信フロー
    ユーザーがUSBアクセサリをAndroidデバイスに接続すると、Androidシステムはアプリケーションが接続されたアクセサリに興味があるかどうかを確認できます.そうであれば、必要に応じて添付ファイルとの通信を設定できます.このため、アプリケーションは、1、添付ファイルの追加イベントをフィルタするフィルタを使用するか、接続された添付ファイルを列挙し、適切な添付ファイルを見つけることで、接続された添付ファイルを発見する必要があります.2、まだ取得していない場合は、添付ファイルと通信する権限を要求する必要があります.3、添付ファイルと通信するには、適切なインタフェースのエンドポイントでデータの読み取りと書き込みを行う.
    添付ファイルの検出
    アプリケーションは、意図フィルタを使用して添付ファイルを発見し、ユーザーが添付ファイルに接続したときに通知したり、接続された添付ファイルを列挙したりすることができます.アプリケーションが必要な添付ファイルを自動的に検出する場合は、意図的なフィルタを使用すると便利です.すべての接続添付ファイルのリストを取得したい場合や、アプリケーションがフィルタを意図していない場合は、接続添付ファイルを列挙すると便利です.-意図フィルタを使用すると、特定のUSBアクセサリを簡単に見つけることができます.USB添付ファイルの挿入に応答するintent-filterと、特定のUSB添付ファイルの特徴を宣言するmeta-dataを指定します(xmlファイルを指定し、manufacturerメーカー、modelモデル、versionバージョンを含む、検出するターゲットusb添付ファイルの関連属性を宣言します).
    // AndroidManifest
    ...>
       ...
    
    ...>
        ...
        
            "android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
        
        "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter" />
    
    
    
    // res/xml/accessory_filter.xml
    
    <resources>
        //   、  、   
        <usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" />
    resources>
    //In your activity, you can obtain theUsbAccessory that represents the attached accessory from the intent like this:
    UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
  • 添付ファイル
  • を列挙する
    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    UsbAccessory[] accessoryList = manager.getAccessoryList();

    通信権限の取得
    アプリケーションが意図フィルタを使用して接続時のUSBアクセサリを発見すると、関連するUSBアクセサリを挿入すると、アプリケーションが意図を処理することを許可すると、自動的に通信権限が得られます.ない場合は、添付ファイルと通信する前にアプリケーションで権限を明確に要求する必要があります.そうしないと、実行時の例外が放出されます.
    ////           ,                ,UsbManager.EXTRA_PERMISSION_GRANTED         。    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);
                    }
                }
            }
        }
    };
    // 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);
    //    ,      
    UsbAccessory accessory;
    ...
    if (mUsbManager.hasPermission(accessory)) {
        //         
        ...
    } else {
        mUsbManager.requestPermission(accessory, mPermissionIntent);
    }

    添付ファイルとの通信
    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();
        }
    }

    スレッドのrun()メソッドでは、FileInputStreamまたはFileOutputStreamオブジェクトを使用して添付ファイルを読み取り、書き込むことができます.FileInputStreamオブジェクトの添付ファイルからデータを読み込む場合は、USBパケットデータを格納するのに十分なバッファを使用してください.Androidアクセサリ・プロトコルは、最大16384バイトのパケット・バッファをサポートするため、バッファを常にこのサイズに宣言することで、操作を簡素化できます.
    添付ファイルとの通信を切断
    添付ファイルとの通信または添付ファイルの分離が完了したら、コールで開いたファイル記述子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
                }
            }
        }
    };

    リストではなくアプリケーションにブロードキャスト受信機を作成し、アプリケーションが実行中に分離されたイベントのみを処理できるようにします.これにより、分離イベントは、すべてのアプリケーションにブロードキャストするのではなく、現在実行中のアプリケーションにのみ送信されます.