将文件从原始存储复制到外部存储

时间:2016-11-24 06:10:48

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

尝试将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模式下)。但我想这是另一个问题。

2 个答案:

答案 0 :(得分:0)

如果你在设备操作系统版本安装android M及更多,你需要在运行时获取权限。单独添加清单是不够的。有关详细信息,请参阅this

答案 1 :(得分:0)

您可以指定正在使用的外部存储设备(非SD卡),因为如果您使用的是Environment.getExternalStorageDirectory(),那么它将为您提供SD卡存储的路径,类似于此{{ 1}}其中0表示主存储设备。