You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:31:58