【问题标题】:Copying file from raw to external storage将文件从原始存储复制到外部存储
【发布时间】:2016-11-24 06:10:48
【问题描述】:

尝试将 PDF 文件(模板)复制到外部存储(非 SD 卡)中的自定义目录。

public void copyPDFToExternal(String newFileName) throws IOException {
        // Create directory folder if it doesnt exist.
        File folder = new File(Environment.getExternalStorageDirectory() +
                File.separator + "pdfFolder");
        if (!folder.exists()){
            folder.mkdir();
        }

        // Copy template
        InputStream in = getResources().openRawResource(R.raw.pdf_template);
        FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() +
            File.separator + "pdfFolder/"+newFileName+".pdf");

        byte[] buff = new byte[1024];
        int read = 0;
        try {
            while ((read = in.read(buff)) > 0 ) {
                out.write(buff, 0, read);
            }
        } finally {
            in.close();
            out.close();
        }

    }

我在 AndroidManifest.xml 中添加了以下内容,而不是在应用程序标签中。

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

完全错误:http://pastebin.com/TBtbekiB

如果您需要我发布任何其他内容,请告诉我。

我哪里出错了?

更新:不再崩溃,但现在似乎什么也没做... mkdirs 返回 true。

public void copyPDFToExternal(String newFileName) throws IOException {
        File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
                "/test/");
        if (!folder.exists()){
            if (!folder.mkdirs()){
                eme.setText("Failed");
                return;
            };
        }

        InputStream in = getResources().openRawResource(R.raw.ohat);
        FileOutputStream out = new FileOutputStream(folder.getAbsolutePath() +"/"+newFileName+".pdf");

        byte[] buff = new byte[1024];
        int read = 0;
        try {
            while ((read = in.read(buff)) > 0 ) {
                out.write(buff, 0, read);
            }
        } finally {
            in.close();
            out.close();
        }
    }

我还添加了一个权限请求,这有点长所以使用pastebin。

http://pastebin.com/KgivWNuc

编辑 2:

看来它确实有效,只是当设备连接到计算机时(在 MTP 模式下)看不到目录。但我想这是另一个问题。

【问题讨论】:

  • 尝试使用 Environment.getExternalStorageDirectory().getAbsolutePath();如果您要指定文件夹,则首先在文件引用上运行 mkdirs()。
  • 同样的问题。抛出 java.io.FileNotFoundException: /storage/emulated/0/pdfFolder/testfile.pdf: 如果 folder.exists() 返回 false,我运行 folder.mkdir(),这是错误的方法吗?
  • 这样没关系,mkdirs 只是创建中间的所有文件夹,尝试创建一个只有路径而不是pdf名称的文件引用,然后创建它。
  • 抱歉,还是安卓新手,什么意思?
  • 新文件(Environment.getExternalStorageDirectory().getAbsolutePath()+"/test/");像这样的东西。

标签: android android-file android-external-storage


【解决方案1】:

如果您在设备操作系统版本 android M 中安装,则需要在运行时获得许可。仅添加清单是不够的。详情请参考this

【讨论】:

  • 我添加了一个请求权限的方法,在这里可以看到:pastebin.com/KgivWNuc 虽然它不再崩溃,但它不会创建目录。
【解决方案2】:

您能否按您所说的那样指定您正在使用的外部存储(非 SD 卡),因为如果您使用的是Environment.getExternalStorageDirectory(),那么它将为您提供 SD 卡存储的路径,例如 /storage/emulated/0/ 其中0 代表主存储设备。

【讨论】:

  • 不,这不会提供可移动 SD 卡的路径。
  • 从我读到的外部存储是您的应用程序数据文件夹之外的文件夹。基本上我想在与公共文件夹(音乐、图片等)相同的目录中创建文件夹。
猜你喜欢
  • 2023-03-05
  • 2011-12-26
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2021-12-10
相关资源
最近更新 更多