当前位置: 首页 > 知识库问答 >
问题:

如何在Android Q中选择要上传到图库的特定视频文件?

郭元明
2023-03-14

在使用mediaRecorder和Camera API录制了一段视频后,我试图将视频保存到用户的多媒体资料中(通过保存到用户的外部电影、DCIM目录或其他)。

不幸的是,我从文档或StackOverflow中找到的代码似乎创建了它们各自的URI,而没有参考录制的视频或保存视频的文件。具体来说,我尝试使用的代码是:

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

    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 pfd;

    try {
        pfd = context.getContentResolver().openFileDescriptor(uriSavedVideo,"w");

        assert pfd != null;
        FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());

// Get the already saved video as fileinputstream from here
            File storageDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "Folder");
            File imageFile = new File(storageDir, "testStorage");

            FileInputStream in = new FileInputStream(imageFile);


            byte[] buf = new byte[8192];
            int len;
            while ((len = in.read(buf)) > 0) {

                out.write(buf, 0, len);
            }
            out.close();
            in.close();
            pfd.close();

        } catch (Exception e) {

            e.printStackTrace();
        }

它周围的代码和答案似乎暗示着通过访问MediaStore。VOLUME\u EXTERNAL\u PRIMARY分解器可以访问保存的视频文件,但我看不到对它的明确引用。在录制视频之前,我将分配给mediaRecorder的文件定义为:

static File getMediaFile(Context c) {

    File mediaStorageDir = c.getExternalFilesDir(null);
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

    return new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");

}

停止视频后,我得到了这个错误(参考这行:uriSavedVideo=resolver.insert(collection,valuesvideos) ):

java.lang.不支持的操作异常:未知的URI:内容://媒体/external_primary/视频/媒体在android.database.数据库Utils.read例外来自包裹(数据库Utils.java.167)...

如何正确创建URI并参考保存的视频?从文件URI替换URI。fromFile(f) 代替uriSavedVideo也不起作用。


共有1个答案

公良光熙
2023-03-14

要将特定的视频文件保存到图库,我将该文件作为参数传递给new FileInputStream

其次,正如Android文档所述:

只有应用可以查看文件,直到应用将IS_PENDING的值更改回0。

因此,根据user@Blackapps的建议,我手动更改了该状态。更改的代码如下:

private static void addToApi29Gallery(File file, Context context) {
    String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";

    ContentValues valuesvideos = new ContentValues();
    valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "Trickshott");
    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); //all video files on primary external storage
    Uri uriSavedVideo = resolver.insert(collection, valuesvideos);

    ParcelFileDescriptor pfd;

    try {
        pfd = context.getContentResolver().openFileDescriptor(uriSavedVideo,"w");

        assert pfd != null;
        FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());

        // Get the already saved video as fileinputstream from here.
        FileInputStream in = new FileInputStream(file);
        
        byte[] buf = new byte[8192];
        int len;
        
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        
        out.close();
        in.close();
        pfd.close();
        
        valuesvideos.clear(); 
        valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 0); // Only your app can see the files until pending is turned into 0.

        context.getContentResolver().update(uriSavedVideo, valuesvideos, null, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 类似资料:
  • 我正在通过共享按钮将视频上传到youtube。如果我点击上传按钮,它会显示社交图标,比如whatsapp、facebook、youtube。当我点击youtube时,它应该被上传到youtube。 下面是我的代码: 选择视频后,我可以选择youtube图标。然后,您的Tube窗口会自动关闭。任何建议都是非常可观的。谢谢!

  • 我将html写成 现在我希望如果选项是1,那么它应该被选择为 请帮帮我!!!

  • 我正在尝试做一个小应用程序,只显示图片从一个特定的文件夹在一个图库视图。我找到了几个例子,但每一个都只能显示一个图像。我将在下面发布的这个例子是一个很好的帮助,它做几乎完全是我想要它做的,我只需要改变它显示图像从特定的文件夹,而不是所有的文件夹。我花了几天的时间来尝试,但我似乎没有添加正确的代码。我觉得这是一件很简单的事情,我也错过了。如有任何帮助,我们将不胜感激!

  • 我想显示“users”表中两个指定列“first_name”和“pic”的所有值。我正在尝试“Pulk”,但它在echo时显示为json格式。但我需要展示给大家看,一些东西——‘John pic’。求求你,有人帮帮我。这是我在“索引”中的示例代码。刀身php的吼声-

  • 问题内容: 控制器: 视图: Javascript: 但是,我得到一个错误 我试图从ajax发布数据和文件,但是它不起作用。我的问题是如何解决该错误?为什么控制器无法读取用户文件的内容? 谢谢 问题答案: 尝试将您的输入内容放入表单并提供id =’your_form_id表单,然后以这种方式在javascript中发送数据: 然后替换这行 有了这个 也设置以下:

  • 我想做的是上传一个网络摄像头或音频流到Nodejs并保存到磁盘。目标是一旦数据可用,就将数据块发送到服务器。我已经从gerUserMedia,安装媒体记录器中抓取了流,当数据可用时,我将Blob转换为arrayBuffer并将其发送到服务器。我知道代码是错误的,因为我不确定正确的方法是什么,但是当数据被发送到服务器时,一个文件被保存,但只有1kb的文件,在那里它应该是一个大的视频文件。我该怎么做呢