Android 从谷歌照片应用程序获取视频(非本地)

Android 从谷歌照片应用程序获取视频(非本地),android,android-intent,google-plus,android-photos,google-photos,Android,Android Intent,Google Plus,Android Photos,Google Photos,使用谷歌照片应用程序,我试图选择一个未缓存在设备上的视频 我正在使用操作获取内容意图来启动选项对话框,并从中选择谷歌照片应用程序 在选择本地视频时,它以这种形式返回Uri content://media/external/video/media/6708 然后,我查询内容提供者以检索实际的文件位置,然后从那里开始。文件位置如下所示 /存储/模拟/0/WhatsApp/Media/WhatsApp 视频/VID-20131102-WA0000.mp4 现在,当我选择一个在线视频时,即:我的设备上还

使用谷歌照片应用程序,我试图选择一个未缓存在设备上的视频

我正在使用操作获取内容意图来启动选项对话框,并从中选择谷歌照片应用程序

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

content://media/external/video/media/6708

然后,我查询内容提供者以检索实际的文件位置,然后从那里开始。文件位置如下所示

/存储/模拟/0/WhatsApp/Media/WhatsApp 视频/VID-20131102-WA0000.mp4

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

ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver() .openFileDescriptor(Uri.parse(path),"r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); InputStream inputStream = new FileInputStream(fileDescriptor); BufferedInputStream reader = new BufferedInputStream(inputStream); // Create an output stream to a file that you want to save to BufferedOutputStream outStream = new BufferedOutputStream( new FileOutputStream(filePath)); byte[] buf = new byte[2048]; int len; while ((len = reader.read(buf)) > 0) { outStream.write(buf, 0, len); } content://com.google.android.apps.photos.content/1/

现在,有了这个,没有一个文档化的内容提供者可以帮助我获得这个视频的实际链接。即使我执行查询,它也只返回显示名称和大小列

DISPLAY\u NAME包含video.mpeg(不同视频的显示名称相同)

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

我查看了各种帖子,认为我必须通过内容提供商获取视频的输入流,保存文件,然后处理文件。不过,拾取图像文件可以很好地工作,但对于视频文件则不行

因此,要将流复制到文件中,我有以下代码

InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path)); InputStream InputStream=context.getContentResolver().openInputStream(Uri.parse(path)); 最后写入一个临时文件。该文件已创建,但似乎格式不正确。VLC播放文件,但始终仅显示第一帧

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


有人经历过同样的情况吗?

终于找到了问题的解决方案。这将适用于图像和视频

引用此视频:

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

意向意向=新意向(意向.行动\u获取\u内容); intent.setType(“image/*”); 星触觉(意向); 获取Uri,并按如下方式访问和保存文件:

ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver() .openFileDescriptor(Uri.parse(path),"r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); InputStream inputStream = new FileInputStream(fileDescriptor); BufferedInputStream reader = new BufferedInputStream(inputStream); // Create an output stream to a file that you want to save to BufferedOutputStream outStream = new BufferedOutputStream( new FileOutputStream(filePath)); byte[] buf = new byte[2048]; int len; while ((len = reader.read(buf)) > 0) { outStream.write(buf, 0, len); } ParcelFileDescriptor ParcelFileDescriptor=context.getContentResolver() .openFileDescriptor(Uri.parse(path),“r”); FileDescriptor FileDescriptor=parcelFileDescriptor.getFileDescriptor(); InputStream InputStream=新文件InputStream(文件描述符); BufferedInputStream读取器=新的BufferedInputStream(inputStream); //创建要保存到的文件的输出流 BufferedOutputStream outStream=新的BufferedOutputStream( 新的FileOutputStream(filePath)); 字节[]buf=新字节[2048]; 内伦; 而((len=reader.read(buf))>0){ 输出流写入(buf,0,len); }
出于某种原因,不使用ParcelFileDescriptor获取输入流是不可行的。

非常感谢您的帮助,这对您很有帮助!下面是一个相关的问题和公认的答案:
outStream.flush()会有所帮助。