我有一个方法如下:
private String getRealPathFromUriForVideos(Uri selectedVideoUri) {
String wholeID = DocumentsContract.getDocumentId(selectedVideoUri);
String id = wholeID.split(":")[1];
String[] column = { MediaStore.Video.Media.DATA };
String sel = MediaStore.Video.Media._ID + "=?";
Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{ id }, null);
String filePath = "";
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
这可以很好地获取用户选择的视频文件。但是,我想让用户也可以创建新视频(来自我的应用),然后从那里获取URI和文件。新创建的视频的URI为: content:// media / external / video / media / 41 。对于选定的视频,如 content://com.android.providers.media.documents/document/video%3A42 。
它适用于第二个,但不适用于第一个。第一个我得到IllegalArgumentException,因为它不是文档URI。如何从第一个URI获取文件?
答案 0 :(得分:3)
这可以很好地获取用户选择的视频文件
它可能在少数情况下有效。它一般不起作用。从ACTION_MANAGE_OVERLAY_PERMISSION
之类的东西中获得的Uri
不一定代表文件,更不用说可以通过文件系统访问的文件了,更不用说这个脚本小子算法允许您访问的文件了。
新制作视频的URI为:content:// media / external / video / media / 41
不一定。我想有一种方法可以为录制的视频获得ACTION_OPEN_DOCUMENT
这样的内容,虽然我无法想到推荐的方式会给你这样的Uri
。如果您使用的是Uri
或MediaRecorder
,则可以创建自己的文件(对于ACTION_VIDEO_CAPTURE
,您可以创建自己的ACTION_VIDEO_CAPTURE
文件。而且,如果您要创建自己的文件,则知道该文件的位置。
需要能够上传到我的服务器
对于视频,录制到您控制的文件,然后使用该文件。
使用一些可让您从Uri
或Uri
上传的库。否则:
InputStream
和ContentResolver
获取openFileInput()
所代表内容的InputStream
Uri
(例如,在FileOutputStream
中)getCacheDir()
复制到InputStream
您将外国OutputStream
视为Web服务器的URL:流式传输内容。
答案 1 :(得分:0)
似乎从我需要的第二个URI中获取它:
private String getRealPathFromUriForImagesAndVideo(Uri contentUri) {
Cursor cursor = null;
try {
String[] proj = {MediaStore.Images.Media.DATA};
cursor = getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} catch (Exception e) {
return contentUri.getPath();
} finally {
if (cursor != null) {
cursor.close();
}
}
}