首页 > 解决方案 > 如何将视频保存到图库并检索保存的视频 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, 0, 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, 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);
                     ContentResolver resolver = context.getContentResolver();
                     Uri collection = MediaStore.Video.Media.INTERNAL_CONTENT_URI;
                     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, 0, len);
                         }
                         out.close();
                         in.close();
                         parcelFileDescriptor.close();
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
                     valuesvideos.clear();
                     context.getContentResolver().update(uriSavedVideo, valuesvideos, null, null);

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

标签: javaandroidandroid-studiomediastore

解决方案


推荐阅读