Android - 使用内容提供商保存视频

时间:2017-02-26 12:28:18

标签: android video android-contentprovider

我尝试将视频保存到SD卡。为了测试我的代码,我将所选视频从图库保存到另一个文件夹。

我打电话给画廊意图,并选择一个视频。 onActivityResult函数代码如下:

if(requestCode == VIDEO_PICK) {
        if (resultCode == RESULT_OK) {
            try {
                String path = getRealPathFromURI(data.getData());
                Log.i("@@Path ", " " + path);

                File file = new File(new URI(path));
                Uri uri = addVideo(file);
            } catch(Exception err) {
                Log.i("@@Exception", " " + err);
            }
        }
}

public Uri addVideo(File videoFile) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Video.Media.TITLE, "My video title");
    values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    values.put(MediaStore.Images.Media.DISPLAY_NAME, "player");
    values.put(MediaStore.Images.Media.DESCRIPTION, "");
    values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
    values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
    values.put(MediaStore.Video.Media.DATA, videoFile.getAbsolutePath());

    return getActivity().getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

}

addVideo函数抛出异常。

  

java.lang.IllegalArgumentException:URI不是绝对的:

如何从uri获得绝对路径?我试过uri.toString()和uri.getPath()。他们没有工作。

getRealPathFromUri实现是here

1 个答案:

答案 0 :(得分:1)

  

我应该从uri创建一个文件吗?

如果Uri方案是file,那么getPath()将是指向该文件的文件系统路径,并且可能您可以阅读它。

如果Uri方案是content,则getPath()是无意义的字符串。理想情况下,您只需使用Uri本身,或使用ContentResolveropenInputStream()获取InputStream标识的内容Uri。如果出于某种原因,您绝对需要一个文件,请使用InputStream将内容的字节复制到您控制的某个文件中。