如何将从VideoView获取的视频保存到外部SD卡?

时间:2015-02-21 04:34:38

标签: android android-sdcard android-file android-videoview

我试图保存视频,我已经成功捕获并放入我的VideoView我的SD卡。很多研究,但我发现没有什么简单明了的方法来帮助解决我的问题。

我能够使用非常相似的代码将照片保存到SD卡(除了Uri参数,而不是Bitmap参数),所以我认为代码应该类似,但是有一部分(我认为?)缺失,图像通常在参数中压缩图像,视频不压缩,因此我的代码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();
                }

            }
        });
    }

1 个答案:

答案 0 :(得分:1)

原来这有多个问题。第一个是您不能将OnClickListenerVideoView一起使用,它必须是OnTouchListener。然后,我必须得到一个绝对路径,而不仅仅是一个简单的getPath()。然后又一行,我在创建其目录和名称后,必须在我的File对象上调用createNewFile()。甚至不需要任何其他文件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;
            }
        });
    }