Android通过OTG线将文件写入USB

时间:2015-02-27 07:52:25

标签: android android-external-storage writing

我一直在寻找关于android文件编写的许多主题,但他们中的大多数都想把文件写入android内部存储。其他想要在外部SD卡上写文件的人根本没有成功。我的情况非常相似,但我认为将文件写入外部USB是一个完全不同的情况。

我正在使用三星galaxy Note II运行股票TouchWiz 4.4.2 [未生根]。我的手机支持micro-USB-OTG,我可以将我的USB挂载为rwxrwx-x而不需要生根。我的USB的完整路径是/ storage / UsbDriveA。

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Android Manifest中的

所以我想知道为什么我的代码不起作用。

此外,我可以使用Root Browser(无root使用它)和Simple Browser向我的USB写任何内容,因此我相信有一种方法可以做到这一点。

这是我的代码:

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());

提前致谢!!!

2 个答案:

答案 0 :(得分:3)

从android 4.4开始,您可以使用Storage Access Framework访问可移动媒体(请参阅https://commonsware.com/blog/2014/04/09/storage-situation-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());
    }
}

3)使用ContentResolver打开outputStream并使用它来复制文件

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();
        }
    }
}

答案 1 :(得分:1)

来自https://source.android.com/devices/storage/

  

从Android 4.4开始,......

     

WRITE_EXTERNAL_STORAGE权限只能授予对其的写访问权限   设备上的主要外部存储。不得允许应用   写入辅助外部存储设备,除了它们   特定于程序包的目录,由合成权限允许。   以这种方式限制写入可确保系统可以清理文件   何时卸载应用程序。

因此,从具有多个外部存储设备的Android 4.4开始,您将只能在主外部存储上写入。考虑到外部存储并不仅仅意味着“真正的外部”设备。它定义如下(来自External Storage reference

  

外部存储可以通过物理介质(例如SD)提供   卡),或通过一个内部存储的一部分暴露   仿真层。

无论如何,有一种解决方法是使用媒体内容提供商写入辅助外部存储。看看http://forum.xda-developers.com/showthread.php?t=2634840

我在我的一个项目中使用它,但正如作者所说,它远非理想的解决方案,并且不能保证能够用于即将推出的Android版本,所以你不能让你的所有应用都依赖于这个解决方法。