传输文件 USB 大容量存储 OTG
Transfer Files USB Mass Storage OTG
我有一个连接到 Android 设备的外部大容量存储设备。我需要将根目录中的几个 .BIN 文件读入我的应用程序。我能够连接到设备并使用 UsbDeviceConnection 接收 usb 权限。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String output = outputTV.getText().toString();
String action = intent.getAction();
outputTV.setText(outputTV.getText() + "\n" + " ACTION: " + action);
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) {
if (device.getInterfaceCount() > 0) {
usbIntf = device.getInterface(0);
usbEndIn = usbIntf.getEndpoint(0);
usbEndOut = usbIntf.getEndpoint(1);
usbConnection = mUsbManager.openDevice(device);
usbConnection.claimInterface(usbIntf, true);
byte[] buffer = new byte[usbEndIn.getMaxPacketSize()];
StringBuilder str = new StringBuilder();
int retVal = usbConnection.bulkTransfer(usbEndIn, buffer, usbEndIn.getMaxPacketSize(), 2000);
for (int i = 2; i < buffer.length; i++) {
if (buffer[i] != 0) {
str.append((char) buffer[i]);
}}}}}}}}};
连接后我可以看到我有一个大容量存储接口和 2 个批量传输端点(一进一出)。
当使用 usbConnection.bulkTransfer 时,我收到 -1 返回和一个空缓冲区。所以,我在接收数据时遇到了问题。一旦越过这个障碍,数据会是什么样子?如何继续从设备中提取所有文件?有没有办法将数据文件逐个文件传输到我的应用程序?有没有更好的方法来解决这个问题?
好吧,我最终选择了一条完全不同的路线。我现在使用标准 java.io.File 并按照我的方式处理目录结构。我的代码还没有完善,但这里是它的要点...
private void setupFileIO() {
File storageDir = new File("/storage");
File files[] = storageDir.listFiles();
File directory = null;
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isDirectory() && f.getPath().toLowerCase().contains("usb") && f.canRead()) {
directory = f;
break;
}
}
}
if (directory != null && directory.canRead()) {
File file[] = directory.listFiles();
if (file != null && file.length > 0) {
for (int i = 0; i < file.length; i++) {
String filePath = file[i].getPath();
String extension = Files.getFileExtension(filePath);
if (file[i].isFile() && file[i].canRead() && extension.equalsIgnoreCase("bin")) {
try {
byte[] r = Files.toByteArray(file[i]);
String result = BaseEncoding.base16().encode(r);
// do something with result
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
我有一个连接到 Android 设备的外部大容量存储设备。我需要将根目录中的几个 .BIN 文件读入我的应用程序。我能够连接到设备并使用 UsbDeviceConnection 接收 usb 权限。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String output = outputTV.getText().toString();
String action = intent.getAction();
outputTV.setText(outputTV.getText() + "\n" + " ACTION: " + action);
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) {
if (device.getInterfaceCount() > 0) {
usbIntf = device.getInterface(0);
usbEndIn = usbIntf.getEndpoint(0);
usbEndOut = usbIntf.getEndpoint(1);
usbConnection = mUsbManager.openDevice(device);
usbConnection.claimInterface(usbIntf, true);
byte[] buffer = new byte[usbEndIn.getMaxPacketSize()];
StringBuilder str = new StringBuilder();
int retVal = usbConnection.bulkTransfer(usbEndIn, buffer, usbEndIn.getMaxPacketSize(), 2000);
for (int i = 2; i < buffer.length; i++) {
if (buffer[i] != 0) {
str.append((char) buffer[i]);
}}}}}}}}};
连接后我可以看到我有一个大容量存储接口和 2 个批量传输端点(一进一出)。
当使用 usbConnection.bulkTransfer 时,我收到 -1 返回和一个空缓冲区。所以,我在接收数据时遇到了问题。一旦越过这个障碍,数据会是什么样子?如何继续从设备中提取所有文件?有没有办法将数据文件逐个文件传输到我的应用程序?有没有更好的方法来解决这个问题?
好吧,我最终选择了一条完全不同的路线。我现在使用标准 java.io.File 并按照我的方式处理目录结构。我的代码还没有完善,但这里是它的要点...
private void setupFileIO() {
File storageDir = new File("/storage");
File files[] = storageDir.listFiles();
File directory = null;
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isDirectory() && f.getPath().toLowerCase().contains("usb") && f.canRead()) {
directory = f;
break;
}
}
}
if (directory != null && directory.canRead()) {
File file[] = directory.listFiles();
if (file != null && file.length > 0) {
for (int i = 0; i < file.length; i++) {
String filePath = file[i].getPath();
String extension = Files.getFileExtension(filePath);
if (file[i].isFile() && file[i].canRead() && extension.equalsIgnoreCase("bin")) {
try {
byte[] r = Files.toByteArray(file[i]);
String result = BaseEncoding.base16().encode(r);
// do something with result
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}