2011-09-10 13 views
9

これで、Android 3.1タブレット(Acer Iconiaタブ、これは素晴らしい方法です)をAndroidで使用できますUSB大容量記憶装置(シンプルなUSBメモリスティック)に接続するためのUSB API。USBホストモードでマウントされたUSBストレージデバイスのファイルI/O(Android 3.1以降)

私はUSBホストモードを使用して、デバイスを見つけ、それに接続するための許可を得ます(BroadcastReceiverを使用)。すべての作品は素晴らしいです。問題は、ファイルを外部ストレージディレクトリからUSBメモリスティックにコピーするために何をすべきかを正確にはわからないことです。

これは私がこれまで持っているものです。

final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (ACTION_USB_PERMISSION.equals(action)) { 
      synchronized (this) { 
      UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

      if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
       if (device != null) { 

        // Got to a point where I should set up connection 
        // I'm setting up a very simple connection, just want some file transfer 

        UsbInterface intf = device.getInterface(0); 
        UsbEndpoint endpoint = intf.getEndpoint(0); 
        UsbDeviceConnection connection = UsbManager.openDevice(device); 

        if (connection.claimInterface(intf, true)) { 
         UtilsAndDialogs.print(getApplicationContext(), "Connected to device"); 

         // Copy file to USB... 

        } else 
         UtilsAndDialogs.print(getApplicationContext(), "Could not connect!"); 
       } 
      } else { 
       UtilsAndDialogs.print(getApplicationContext(), "Permission denied"); 
       Log.d(UtilsAndDialogs.LOG_TAG, "Permission denied for device " + device); 
      } 
     } 
    } 
}; 

私は、Android DevのUsb Host上のドキュメントを読んで、それは非常に明示的ではないと私はかなり良いチュートリアルAndroid Usb Host Tutorial - AdbTestが見つかりましたが、それは非同期通信を使用しています。

USBストレージデバイスに新しいファイルを作成できるようにするには、接続を設定してエンドポイントを使用する必要があります(私はエンドポイントの部分を取得できませんでした)おそらくbulkTransfer()メソッドを使用して、そこにある別のファイルの内容をコピーします。

より明示的なドキュメントへのヒントや指針は、非常に高く評価されます。

答えて

1

あなたの接続が設定されてありがとう、エンドポイントは、データ転送に関する情報をデバイス上で基本的にフラグです。あなたが持っているどのように多くのエンドポイントを把握するVVのような何かをする必要があり、あなたのスティック

UsbInterface intf = device.getInterface(0); 
// checks for 2 endpoints 
if (intf.getEndpointCount() != 2) { 
Toast toast = Toast.makeText(context, "could not find endpoint", duration); 
toast.show(); 
return; 
    } 
UsbEndpoint ep = intf.getEndpoint(0); 
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { 

これはあなたが興味を持っているエンドポイントは、バルク(USB定数であれば、あなたが把握できるようになりますdocsには他のタイプがあります)、そのエンドポイントでデバイスとの間でデータをやりとりすることができます(usb_dir_inでテストする)。デバイス固有のものです、私の例では、0から始まりますどのような終点あなたが望む、あなたは、私は、バッファにそれがでいっぱいにするたびに保存されているあなたは

mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT); 

ような何かをする必要があるファイルを再保存するには

異なるものになりますファイル出力ストリームでは、これはおそらく非効率的です(私はbulktransferが既にどこかに保存していると仮定していますが)ドキュメントが不足しています。

+0

うわー、お返事ありがとうございます。私は答えを得ることを失った。私は今日それをチェックし、それがうまくいくならあなたの答えを受け入れるでしょう:)。 – Bandreid

+1

@Bandreidどのように転送するかを指定する方法がわかりません。 "/ docs/alphabet /"にあるファイル 'abc.txt'を送ってください。 –

+0

@Mike Ortiz - このコード部分は私の質問に追加しませんでした。 – Bandreid

4

Android USBホストAPIはraw USBアクセスのみを提供します。メモリデバイス上のファイルにアクセスするには、USBアプリの上にUSBマスストレージモードを実装し、その上にファイルシステムのコードを実装する必要があります。

いくつかのベンダーカスタマイズバージョンのAndroidは、オペレーティングシステムレベルで認識されたファイルシステムを搭載したUSB大容量ストレージデバイスをマウントしますが、現在のところ標準のAndroidの一部ではありません。また、ルートデバイスを使用している場合は、そのようなファイルシステムをマウントするようにカーネルに納得させることができます。

+1

USBマスストレージモードを実装するための良い例が見つかりません。指摘できる人がいますか? –

+0

私は気づいていませんが、大容量ストレージは簡単な部分です。ファイルシステムの実装も必要です。 –

+0

プロセスを簡単にするライブラリがありますか? –

関連する問題