从Dropbox文件夹下载文件报错:EROFS只读文件系统问题求助
解决Dropbox下载文件时的EROFS只读文件系统错误
这个问题的核心原因很明确:你试图把文件直接写入Android系统的根目录/,而这个目录是只读的——哪怕你申请了运行时权限,系统也不会允许普通应用修改根目录内容。Android系统为了安全性,早就限制了对系统根目录的写入操作,你需要选择一个合法的可写入路径来保存下载的文件。
可选的合法存储路径及解决方案
1. 使用应用内部私有存储(推荐,无需额外权限)
应用的内部私有目录只有你的应用能访问,卸载应用时会自动删除,适合存储应用专属的文件。你可以通过getFilesDir()获取这个目录的路径:
修改后的代码示例:
public void getIt(View v){ DbxRequestConfig config = new DbxRequestConfig("dropbox/DropBoxIntegration_CRUD_Android-master"); String accessToken = mDBApi.getSession().getOAuth2AccessToken(); DbxClientV2 client = new DbxClientV2(config, accessToken); try { DbxDownloader<FileMetadata> downloader = client.files().download("/test/pic.jpg"); // 获取应用内部私有存储目录,创建输出文件 File outputFile = new File(getFilesDir(), "pic.jpg"); FileOutputStream out = new FileOutputStream(outputFile); downloader.download(out); out.close(); // 提示用户文件保存路径 Toast.makeText(this, "文件已保存至:" + outputFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); } catch (DbxException ex) { System.out.println("Dropbox操作错误:" + ex.getMessage()); Toast.makeText(this, "下载失败:" + ex.getMessage(), Toast.LENGTH_SHORT).show(); } catch (Exception e ){ e.printStackTrace(); Toast.makeText(this, "文件保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
2. 使用外部存储的公共目录(需要权限)
如果你想让文件能被其他应用访问(比如相册、文件管理器),可以使用外部存储的公共目录(如下载目录)。注意在Marshmallow及以上系统,需要提前申请WRITE_EXTERNAL_STORAGE运行时权限:
// 先检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001); return; } // 权限通过后,使用公共下载目录 File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File outputFile = new File(publicDir, "pic.jpg"); // 后续写入逻辑和上面一致
3. 使用外部存储的应用私有目录(Android 10+无需权限)
这个目录属于你的应用在外部存储的专属区域,卸载应用时会被删除,Android 10及以上系统不需要申请存储权限:
File externalPrivateDir = getExternalFilesDir(null); File outputFile = new File(externalPrivateDir, "pic.jpg"); // 后续写入逻辑同上
关键注意事项
- 不要直接写入根目录或系统敏感目录,这是Android安全模型的核心限制;
- 针对不同Android版本的权限差异,务必做好权限检查和申请逻辑;
- 写入文件后记得关闭流,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Rohit S
相关产品推荐
相关产品推荐

