我一直在寻找关于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());
提前致谢!!!
答案 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版本,所以你不能让你的所有应用都依赖于这个解决方法。