更新 我已经用下面的代码解决了这个问题。基本上它会创建一个文件并将流从原始文件复制到新文件中,这样我们的应用程序就有一份文件副本可以安全地上传到服务器。
try {
ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(videoUri, "r", null);
FileInputStream inputStream = new FileInputStream(parcelFileDescriptor.getFileDescriptor());
file = new File(getContext().getCacheDir(), getFileName(videoUri));
FileOutputStream outputStream = new FileOutputStream(file);
IOUtils.copy(inputStream, outputStream);
} catch (Exception e) {
e.printStackTrace();
}
我想在我的应用程序在工作资料中工作时从图库中选择一个视频并上传到服务器。当应用程序在私人配置文件中运行时,一切正常,但是当我在工作配置文件中运行应用程序时,我的应用程序崩溃了。
File file = new File(videoPath);
正在使应用程序崩溃。
java.lang.IllegalArgumentException: Invalid file:
/storage/emulated/0/DCIM/Camera/VID_20200511_121657.mp4
该应用程序正在处理工作配置文件并在运行时授予权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
不知何故,它仅在工作配置文件中找不到用户库中的文件,因为我可以在私人配置文件中上传具有相同代码的相同文件。提前致谢!
更新:当我将视频上传到 AWS 时,应用程序崩溃了。
public TrasferObserver upload(String bucket, String key, File file, ...) {
if (file == null || file.isDirectory() || !file.exists()) {
throw new IllegalArgumentException("Invalid file: " + file);
}
//some other aws code
}
好吧,我所做的基本上是从选择器中获取 uri,然后从我的函数中获取视频路径。
public String getPath(Uri uri, Context context) {
String[] projection = {MediaStore.Video.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
cursor.moveToFirst();
return cursor.getString(columnIndex);
} else {
return null;
}
}
然后从路径创建文件File file = new File(videoPath);
并调用上传方法。
我已经对其进行了测试,new File(uri.getPath());
但两者都不起作用。
还有一条评论:代码在私人配置文件中正常工作。