处理Uri而不创建新文件

时间:2019-10-01 07:47:56

标签: java android android-file

我正在使用的库要求我为其传递文件路径。

当前,我使用Uri来创建一个新文件(在AsyncTask中),如下所示:

@Override
protected String doInBackground(Uri... params) {
    File file = null;
    int size = -1;
    try {
        try {
            if (returnCursor != null && returnCursor.moveToFirst()){
                int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
                size = (int) returnCursor.getLong(sizeIndex);
            }
        }
        finally {
            if (returnCursor != null)
            returnCursor.close();
        }

        if (extension == null){
            pathPlusName = folder + "/" + filename;
            file = new File(folder + "/" + filename);
        }else {
            pathPlusName = folder + "/" + filename + "." + extension;
            file = new File(folder + "/" + filename + "." + extension);
        }

        BufferedInputStream bis = new BufferedInputStream(is);
        FileOutputStream fos = new FileOutputStream(file);

        byte[] data = new byte[1024];
        long total = 0;
        int count;
        while ((count = bis.read(data)) != -1) {
            if (!isCancelled()) {
                total += count;
                if (size != -1) {
                    publishProgress((int) ((total * 100) / size));
                }
                fos.write(data, 0, count);
            }
        }
        fos.flush();
        fos.close();

    } catch (IOException e) {
        errorReason = e.getMessage();
    }
    return file.getAbsolutePath();
}

您可以想象,这可能需要一些时间,具体取决于文件大小。

问题

有什么方法可以访问文件而无需创建/复制文件?

*我已阅读到可以使用ContentResolver以及openInputStream()openOutputStream()之类的方法。但这只会为我提供一个流,而不能解决我必须编写一个新文件的问题?


其他信息:

我通过将以下内容传递给Intent来获得Uri:

intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);

然后在onActivityResult中,我通过致电data.getData()来获取Uri。


请不要向我提供像this这样的解决方案。我不想从内容Uri获取文件Uri,因为它不可靠且不正确。

1 个答案:

答案 0 :(得分:0)

很明显,如果只有内容计划,那么无法处理内容计划的库就没有用了。

您必须在文件中复制内容。就像您现在所做的那样。