[解決済み] 適切なエンドポイントを使用したAndroidのBulkTransferから応答がない
質問事項
バルク転送に関する多くの質問をここで見ましたが、そのほとんどは、読み取りと書き込みに間違ったインターフェースを使用しています。
private UsbManager usbManager;
private UsbDevice usbDevice;
private UsbDeviceConnection usbDeviceConnection;
private UsbInterface usbInterface;
private UsbEndpoint readEndpoint;
private UsbEndpoint writeEndpoint;
private UsbEndpoint interruptEndpoint;
private PtpSession ptpSession;
public boolean Connect(UsbManager usbManager,UsbDevice usbDevice, PtpSession ptpSession)
{
if(usbManager == null ||usbDevice == null||ptpSession == null)
return false;
else
{
this.usbManager = usbManager;
this.usbDevice = usbDevice;
this.ptpSession = ptpSession;
for (int i = 0; i < this.usbDevice.getInterfaceCount(); i++) {
UsbInterface uintf = this.usbDevice.getInterface(i);
if (uintf.getInterfaceClass() == UsbConstants.USB_CLASS_STILL_IMAGE) {
Log.d(TAG, "Imaging USB interface found");
this.usbInterface = uintf;
break;
}
}
}
// find the wright usb endpoints
if(usbInterface == null)
return false;
else
{
for(int i = 0; i < usbInterface.getEndpointCount();i++)
{
UsbEndpoint ep = usbInterface.getEndpoint(i);
if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)
{
readEndpoint = ep;
}
else if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT)
{
interruptEndpoint = ep;
}
} else if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
writeEndpoint = ep;
}
}
this.usbDeviceConnection = usbManager.openDevice(usbDevice);
usbDeviceConnection.claimInterface(usbInterface,true);
}
if(readEndpoint == null || writeEndpoint == null ||interruptEndpoint == null)
return false;
return true;
}
この部分は正常に動作しているようですが、次にデータの読み取りと書き込みを行う方法が2つあります。
private boolean writeData(byte[] data)
{
int retry = 0;
while (usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000) != data.length)
{
retry++;
if (retry > 4)
{
return false;
}
}
return true;
}
private byte[] readData()
{
long rStart = System.currentTimeMillis();
byte[] mReadData = new byte[30];
while (true) {
int bytesCount = usbDeviceConnection.bulkTransfer(readEndpoint, mReadData, mReadData.length, 5000);
if (bytesCount >= 0) {
return mReadData;
}
else if (System.currentTimeMillis() - rStart > 5000) {
return new byte[]{};
} else {
Log.e(TAG, String.format("Bulk read -1 cmd"));
}
}
}
私はデータを送信し、writeDataメソッドから肯定的なフィードバックを得ることができます。その後、しばらく(100msあるいは1000ms)待って、readDataを試しています。そして、私は読み取るデータを得たことがなく、フィードバックとして常に-1を得ます(5秒後にメソッドが空の配列を返すまで)。mReadData配列のサイズを他の値に変更してみましたが、今のところうまくいきません(データのサイズは30byteがPTP Protocollの典型的なResponseDataブロックの期待値です)。
私はNikon D3200からスマートフォン(Galaxy S7 with Android 6.0.1 running)のデータをオリジナルのUSB-OTGアダプタで読み取ろうとしています。私のコードが問題であることは間違いありませんが、何時間も様々なことを試してみた結果、何が問題なのか本当に分からなくなりました。
私が使用したISO15740規範へのリンクはこちらです。 ISO 15740へのリンク
もしかしたら、どなたか私の問題が何であるかおわかりになるでしょうか?
よろしくお願いします。 ドミニク
解決方法は?
次のコードは動作しません。
private boolean writeData(byte[] data)
{
int retry = 0;
while (usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000) != data.length)
{
retry++;
if (retry > 4)
{
return false;
}
}
return true;
}
の代わりに、以下を使用して接続状態を確認します。
int ret = usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000;
if(ret < 0)
{
Log.d("TAG", "Error happened!");
}
else if(ret == 0)
{
Log.d("TAG", "No data transferred!");
}
else
{
Log.d("TAG", "success!");
}
(
https://www.developer.android.com/studio/debug/am-logcat.html
ログを記録する代わりに
try {...} catch {...}
ブロックまたは
ログキャット
,...)
からコピーしたものです。 android usb UsbDeviceConnection.bulkTransfer は -1 を返します。
ということは、データの書き込み/読み出しができない理由は、複数の可能性があります。
-
プログラミングエラー (おそらく
writeData()
メソッドへの参照を知らないのでusbDeviceConnection
オブジェクト) のようにメソッドにパラメータとして与えてみてください。private UsbDeviceConnection usbDeviceConnection; private boolean writeData(UsbDeviceConnection usbDeviceConnection, byte[] data) { ... }
でメソッドを呼び出します。
writeData(usbDeviceConnection, ...);
( http://www.programcreek.com/java-api-examples/index.php?api=android.hardware.usbUsbDeviceConnection )
-
プロトコルが正しく設定されていない(つまり、期待された
maxPacketSize
とは異なります。maxPacketSize
,...) -
...
についても同様です。
readData()
メソッド
https://developer.android.com/reference/android/hardware/usb/UsbDeviceConnection.html
関連
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidで現在の時刻と日付を取得する方法
-
[解決済み] Androidでファイルをダウンロードし、ProgressDialogで進捗を表示する。
-
[解決済み] Androidでインテントから余分なデータを取得するにはどうすればよいですか?
-
[解決済み] Android標準のボタンを色違いに
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】Androidで、あるアクティビティから別のアクティビティにオブジェクトを渡す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】不正なエスケープ文字"㊧"について
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver [重複]。
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み】CreateProcess error=2, The system cannot find file specified.
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)