当前位置: 首页 > 知识库问答 >
问题:

Android通过OTG电缆向USB写入文件

钱钊
2023-03-14

我使用的是运行stock TouchWiz 4.4.2的三星galaxy Note II(未根目录)。我的手机支持micro-USB-OTG并且我可以将我的USB挂载为rwxrwx--x而不需要根。我的USB的完整路径是/Storage/USBDriveA。

我尝试使用Environment.getExternalStorageDirectory()获取路径或直接使用路径(上面提到过),但都没有成功。第一个返回内部存储路径,第二个返回带有“权限被拒绝”的错误。我已经把

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

所以我想知道为什么我的代码不能工作。

File file = new File(path.getAbsolutePath(), "test.txt");
// File file = new File("/storage/extSdCard","test.txt");
err = false;
  try {
    FileOutputStream f = new FileOutputStream(file);
    PrintWriter pw = new PrintWriter(f);
    pw.print(get);
    pw.flush();
    pw.close();
    f.close();
  }catch (Exception e) {
    e.printStackTrace();
    Toast.makeText(MainActivity.this, "writing error",Toast.LENGTH_LONG).show();
                err = true;
   }
   Log.i("File Path:", file.getPath());

提前致谢!!!

共有1个答案

刘选
2023-03-14

从Android4.4中,您可以使用存储访问框架访问可移动介质(参见https://commonsware.com/blog/2014/04/09/storage-sociate-removable-storage.html)。例如,我成功地尝试将一个pdf文件从本地内存复制到由OTG适配器连接的可移动内存中。唯一的限制:用户必须选择目标文件夹。

1)调用intent.action_create_document:

Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.setType("application/pdf");
intent.putExtra(Intent.EXTRA_TITLE, file.getName());
startActivityForResult(intent, REQUEST_CODE);

2)拦截返回意图

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if(requestCode == REQUEST_CODE) {
        if (resultCode != RESULT_OK) return;
        copyFile(fileToCopy, data.getData());
    }
}
private void copyFile(File src, Uri destUri) {
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;

    try {
        bis = new BufferedInputStream(new FileInputStream(src));
        bos = new BufferedOutputStream(getContentResolver().openOutputStream(destUri));
        byte[] buf = new byte[1024];
        bis.read(buf);
        do {
            bos.write(buf);
        } while(bis.read(buf) != -1);
    } catch (NullPointerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bis != null) bis.close();
            if (bos != null) bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 类似资料:
  • 我使用的是Android5.0设备,其中usb大容量存储器通过usb OTG电缆挂载在“/storage/usbotg”上。不幸的是,从我的应用程序,我只有读取访问该文件夹。请注意,我设置了写入外部存储权限,因为我可以写入设备存储。 异常消息:拒绝访问路径“/storage/usbotg/newfolder”。 如果我使用: 一切工作正常,“NewFolder”已经创建。 谢谢你的帮助

  • 我正在开发一款支持USB OTG的android手机。

  • 我想先写串口。为此,我使用usb到串行ftdi电缆。电缆连接到COM4。运行64位Windows 7 a) 使用RXTX项目。http://rxtx.qbang.org/wiki/index.php/Main_Page 为了使用RXTX,我试着按照这些说明去做 下载rxtx-2.1-7-bins-r2。zip 解压缩它 复制RXTX序列。dll转换为c:\program files\java\jr

  • 问题内容: 我在python中遇到以下问题。 我需要并行执行一些计算,这些计算的结果需要按顺序写入文件中。因此,我创建了一个函数,该函数接收和文件句柄,进行计算并将结果打印到文件中: 但是脚本运行后文件最终为空。我试图将worker()函数更改为: 并将文件名作为参数传递。然后它按我的预期工作。当我尝试按顺序执行相同的操作而不进行多处理时,它也可以正常工作。 为什么它在第一个版本中不起作用?我看不

  • 问题内容: 我有一个连接到Android设备的外部大容量存储设备。在根目录中,有几个.BIN文件需要读取到我的应用程序中。我能够连接到设备并使用UsbDeviceConnection接收USB许可。 连接后,我可以看到我有一个带有2个批量传输端点的大容量存储接口(一进一出)。 当使用usbConnection.bulkTransfer时,我收到-1返回和一个空缓冲区。因此,我在接收数据时遇到了麻烦

  • 问题内容: 我正在使用opencsv,并希望通过多个会话写入文件。但是,每次我启动新的CSVWriter时,旧文件都会被删除。我可以更改CSVWriter的行为以在文件末尾写入而不是替换文件吗? 问题答案: FileWriter中有一个选项而不是CSVWriter可以附加在文件末尾。 此代码使其工作: