Android 如何将从VideoView拍摄的视频保存到外部SD卡?

Android 如何将从VideoView拍摄的视频保存到外部SD卡?,android,android-sdcard,android-file,android-videoview,Android,Android Sdcard,Android File,Android Videoview,我正在尝试保存一个视频,我已经成功捕获并将其放入我的视频视图,保存到我的SD卡中。很多研究,但我发现没有简单直接的方法来解决我的问题 我能够使用非常相似的代码(除了不是Uri参数,而是Bitmap参数)将照片保存到SD卡上,因此我认为代码应该类似,但缺少一部分(我认为?),图像通常会在其参数中压缩图像,视频不会压缩,因此,在我的代码uriVideo.setOutputFile(video.getPath())中有一行代码错误(红色错误)。但这正是使视频适合保存的地方。虽然这只是一个猜测。这就是照

我正在尝试保存一个视频,我已经成功捕获并将其放入我的
视频视图
,保存到我的SD卡中。很多研究,但我发现没有简单直接的方法来解决我的问题

我能够使用非常相似的代码(除了不是
Uri
参数,而是
Bitmap
参数)将照片保存到SD卡上,因此我认为代码应该类似,但缺少一部分(我认为?),图像通常会在其参数中压缩图像,视频不会压缩,因此,在我的代码
uriVideo.setOutputFile(video.getPath())中有一行代码错误(红色错误)。但这正是使视频适合保存的地方。虽然这只是一个猜测。这就是照片线被压缩的地方

然后在我的
saveVideo()
方法完成后,我在代码中的另一个地方调用我的
VideoView
上的这个方法

我错过了什么?谢谢

 // save your video to SD card
    private void saveVideo(final Uri uriVideo){
        // click the video to save it
        mVideoView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                boolean success = false;

                String root = Environment.getExternalStoragePublicDirectory
                        (Environment.DIRECTORY_MOVIES).toString();
                File myDir = new File(root + "/Saved iCute Videos");
                myDir.mkdirs();
                Random generator = new Random();
                int n = 10000;
                n = generator.nextInt(n);
                String videoName = "Video-"+ n +".mp4";
                File file = new File (myDir, videoName);
                if (file.exists ()) file.delete ();
                try {
                    FileOutputStream out = new FileOutputStream(file);
                    uriVideo.setOutputFile(video.getPath()); // WRONG
                    out.flush();
                    out.close();
                    success = true;
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (success) {
                    Toast.makeText(getApplicationContext(), "Video saved!",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(),
                            "Error during video saving", Toast.LENGTH_LONG).show();
                }

            }
        });
    }

结果发现这有多个问题。首先,您不能将
OnClickListener
VideoView
一起使用,它必须是
OnTouchListener
。然后,我必须得到一个绝对路径,而不是一个简单的
getPath()
。还有一行,我必须在创建文件对象的目录和名称后调用它。甚至不需要任何其他文件I/O代码

以下是最后的工作方法:

 // save your video to SD card
    protected void saveVideo(final Uri uriVideo){

        // click the video to save it
        mVideoView.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {

                boolean success = false;

                // make the directory
                File vidDir = new File(android.os.Environment.getExternalStoragePublicDirectory
                        (Environment.DIRECTORY_MOVIES) + File.separator + "Saved iCute Videos");
                vidDir.mkdirs();
                // create unique identifier
                Random generator = new Random();
                int n = 100;
                n = generator.nextInt(n);
                // create file name
                String videoName = "Video_" + n + ".mp4";
                File fileVideo = new File(vidDir.getAbsolutePath(), videoName);

                try {
                    fileVideo.createNewFile();
                    success = true;
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (success) {
                    Toast.makeText(getApplicationContext(), "Video saved!",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(),
                            "Error during video saving", Toast.LENGTH_LONG).show();
                }

                return true;
            }
        });
    }

你能从VideoView中获取视频吗?是的,它会显示在
VideoView
中,但它不会保存在任何地方,因此当我关闭应用程序时,它会消失。从本地存储或使用网络在VideoView中播放视频?它来自摄像头。一些代码,它只是使用Android摄像头捕捉视频,一旦我回到我的活动中,就会立即播放。但是从那以后,我试图通过点击它来保存它。我在文档中唯一能找到的就是“保存媒体文件”,但它是不完整的。在这里,他们创建了一个目录和一个文件名,但我不知道如何实际保存它。另外,所有的视频都是
Uri
?我不需要设置类型(mp4)或其他什么吗?只是不确定。你有什么设备API?这可能是一个目录问题。我发现在不同的设备上都是如此。例如,某些设备可能没有名为“Movies”的目录。但是如果您能够创建一个文件,那么也只有这样才能
success=true
。因此,如果您要参加成功祝酒会,那么您的文件可能位于SD卡中您不知道的某个位置。您从未在这里使用过
uriVideo
。您好@PriyankaSingh,您的问题似乎已经得到了回答。祝你好运