6

使用Google Photos 应用程序,我正在尝试选择一个未缓存在设备上的视频。

我正在使用ACTION_GET_CONTENT意图来启动选项对话框,然后从那里选择 Google Photos 应用程序。

在选择本地视频时,它会以这种形式返回一个 Uri。

内容://媒体/外部/视频/媒体/6708

然后,我查询内容提供程序以检索实际文件位置,然后从那里继续。文件位置如下所示。

/storage/emulated/0/WhatsApp/Media/WhatsApp Video/VID-20131102-WA0000.mp4

现在,当我选择在线视频时,即:我的设备上还没有视频,需要下载才能使用,返回的 Uri 如下所示:

content://com.google.android.apps.photos.content/1/ https://lh6.googleusercontent.com/_RD-QTO_SK5jlaPldTe2n5GANqMc3h-ukcbNoFlF1NLy=s0-d

现在,有了这个,没有记录的 ContentProvider 可以帮助我获得该视频的实际链接。即使我进行查询,除了 DISPLAY_NAME 和 SIZE 列之外,它不会返回任何内容。

DISPLAY_NAME包含 video.mpeg(不同视频的显示名称相同)

SIZE可能会告诉我实际文件的大小。

参考了这篇关于 SO 的帖子。

我检查了各种帖子,并认为我必须通过内容提供程序获取视频的 InputStream,保存文件并使用该文件。但是,选择图像文件可以正常工作,但对于视频则不行。

所以,要将流复制到文件中,我有这段代码。

InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path));

最后写入一个临时文件。该文件已创建,但似乎格式不正确。VLC 播放文件,但始终只显示第一帧。

如果我从上面给出的 URI 的最后部分获取 URL,并尝试在浏览器上查看它,它会下载一个 GIF 文件。我猜这就是问题所在。但我不知道如何获得视频的mpeg格式。

有人有过同样的经历吗?

4

1 回答 1

10

终于找到了解决问题的办法。这适用于图像和视频。

参考了这个视频:

DevBytes:Android 4.4 存储访问框架:客户端

https://www.youtube.com/watch?v=UFj9AEz0DHQ

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("图片/*");
开始活动(意图);

获取 Uri,然后像这样访问并保存文件:

ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver()
               .openFileDescriptor(Uri.parse(path),"r");

文件描述符 fileDescriptor = parcelFileDescriptor.getFileDescriptor();

InputStream inputStream = new FileInputStream(fileDescriptor);

BufferedInputStream reader = new BufferedInputStream(inputStream);

// 为要保存到的文件创建输出流
BufferedOutputStream outStream = 新的 BufferedOutputStream(
                    新文件输出流(文件路径));
字节[] buf = 新字节[2048];
国际化;
而 ((len = reader.read(buf)) > 0) {
    outStream.write(buf, 0, len);
}

出于某种原因,在不使用 ParcelFileDescriptor 的情况下获取输入流是行不通的。

于 2014-01-08T09:59:20.243 回答