我正在使用的库要求我为其传递文件路径。
当前,我使用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,因为它不可靠且不正确。
答案 0 :(得分:0)
很明显,如果只有内容计划,那么无法处理内容计划的库就没有用了。
您必须在文件中复制内容。就像您现在所做的那样。