如何将视频保存到图库并检索保存的视频uri?

问题描述

我正在尝试为我的应用保存到图库功能。我的应用程序的最低api级别是21,最高30。 这是我用来将视频保存到图库的代码。一切正常,但代码仅适用于API 29及更高版本。这是代码

String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";

                 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                     ContentValues valuesvideos;
                     valuesvideos = new ContentValues();
                     valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH,"Movies/" + "Folder");
                     valuesvideos.put(MediaStore.Video.Media.TITLE,videoFileName);
                     valuesvideos.put(MediaStore.Video.Media.disPLAY_NAME,videoFileName);
                     valuesvideos.put(MediaStore.Video.Media.MIME_TYPE,"video/mp4");
                     valuesvideos.put(MediaStore.Video.Media.DATE_ADDED,System.currentTimeMillis() / 1000);
                     valuesvideos.put(MediaStore.Video.Media.DATE_TAKEN,System.currentTimeMillis());
                     valuesvideos.put(MediaStore.Video.Media.IS_PENDING,1);
                     ContentResolver resolver = context.getContentResolver();
                     Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
                     Uri uriSavedVideo = resolver.insert(collection,valuesvideos);
                     ParcelFileDescriptor parcelFileDescriptor;
                     try {
                         assert uriSavedVideo != null;
                         parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uriSavedVideo,"w");
                         assert parcelFileDescriptor != null;
                         FileOutputStream out = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
                         FileInputStream in = new FileInputStream(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + File.separator + "Application" + File.separator + "video.mp4");
                         byte[] buf = new byte[8192];
                         int len;
                         while ((len = in.read(buf)) > 0) {
                             out.write(buf,len);
                         }
                         out.close();
                         in.close();
                         parcelFileDescriptor.close();
                     } catch (Exception e) {
                         e.printstacktrace();
                     }
                     valuesvideos.clear();
                     valuesvideos.put(MediaStore.Video.Media.IS_PENDING,0);
                     context.getContentResolver().update(uriSavedVideo,valuesvideos,null,null);
                 } 

这是我用于API 29以下版本的代码

ContentValues valuesvideos;
                     valuesvideos = new ContentValues();
                     valuesvideos.put(MediaStore.Video.Media.DATA,context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + File.separator + "Folder");
                     valuesvideos.put(MediaStore.Video.Media.TITLE,System.currentTimeMillis() / 1000);
                     ContentResolver resolver = context.getContentResolver();
                     Uri collection = MediaStore.Video.Media.INTERNAL_CONTENT_URI;
                     Uri uriSavedVideo = resolver.insert(collection,len);
                         }
                         out.close();
                         in.close();
                         parcelFileDescriptor.close();
                     } catch (Exception e) {
                         e.printstacktrace();
                     }
                     valuesvideos.clear();
                     context.getContentResolver().update(uriSavedVideo,null);

如何为较低的API编写此确切函数?现在,我尝试使用MediaScanner,但它似乎太慢了,无法获取已保存文件的uri。希望你会回答。问候。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)