Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 传输文件USB大容量存储OTG_Java_Android_Mobile_Usb Otg_Usb Mass Storage - Fatal编程技术网

Java 传输文件USB大容量存储OTG

Java 传输文件USB大容量存储OTG,java,android,mobile,usb-otg,usb-mass-storage,Java,Android,Mobile,Usb Otg,Usb Mass Storage,我有一个连接到Android设备的外部大容量存储设备。根目录中有几个.BIN文件需要读取到我的应用程序中。我能够使用UsbDeviceConnection连接到设备并接收usb权限 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String output =

我有一个连接到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]);
                            }}}}}}}}};
private final BroadcastReceiver mUsbReceiver=new BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
字符串输出=outputTV.getText().toString();
String action=intent.getAction();
outputTV.setText(outputTV.getText()+“\n”+”操作:“+操作);
if(动作\u USB\u权限等于(动作)){
已同步(此){
UsbDevice设备=(UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_设备);
if(intent.getBooleanExtra(UsbManager.EXTRA_权限_授予,false)){
如果(设备!=null){
if(device.getInterfaceCount()>0){
usbIntf=device.getInterface(0);
usbEndIn=usbIntf.getEndpoint(0);
usbEndOut=usbIntf.getEndpoint(1);
usbConnection=mUsbManager.openDevice(设备);
usbConnection.claiinterface(usbIntf,true);
byte[]buffer=新字节[usbEndIn.getMaxPacketSize()];
StringBuilder str=新的StringBuilder();
int retVal=usbConnection.bulkTransfer(usbEndIn,buffer,usbEndIn.getMaxPacketSize(),2000);
for(int i=2;i
连接后,我可以看到我有一个大容量存储接口和两个大容量传输端点(一进一出)


当使用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();
                    }
                }
            }
        }
    }
}
private void setupFileIO(){
File storageDir=新文件(“/storage”);
File files[]=storageDir.listFiles();
文件目录=null;
如果(files!=null&&files.length>0){
用于(文件f:文件){
if(f.isDirectory()和&f.getPath().toLowerCase().contains(“usb”)和&f.canRead()){
目录=f;
打破
}
}
}
if(directory!=null&&directory.canRead()){
File File[]=directory.listFiles();
如果(file!=null&&file.length>0){
for(int i=0;i
我可以在未植根的Moto G和三星galaxy s5上执行此操作。这是否需要先请求设备的usb权限?或者在访问usb设备之前,您是否仍必须打开设备(
usbManager.openDevice(device)