android ACTION_VIDEO_CAPTURE不保存视频

时间:2014-05-11 18:21:16

标签: android video android-intent record

我使用此代码录制视频并将其保存到SD卡。

MainActivity.class

public void onClickCaptImage() {
//...
        folder = new File(Environment.getExternalStorageDirectory()
                + "/neoadn/neoadnVideo/");
        if (!folder.exists()) {
            if (!folder.mkdirs()) {
                Log.d("UserFolder", "failed to create directory");
            }
        }
        videoName = "test" + ".mp4";
        file = new File(folder.getAbsolutePath() + "/" + videoName );

        mVideoUri = Uri.fromFile(file);

        //....

        Intent intent = new Intent("android.media.action.VIDEO_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mVideoUri);
        startActivityForResult(intent, RESULT_VIDEO_REALIZADO);
    }

的AndroidManifest.xml

<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

此代码可在大多数设备上正常运行。问题是我在Xperia Mini Pro(4.0.4)中没有将视频保存在SD卡中而且没有出错。

我看到的唯一区别是,当Xperia Mini Pro上的完成录制直接进入主屏幕时,在我的nexus 4中显示接受或取消录制视频的选项。

当call-data.getData() - 进入onActivityResult()应用程序返回以下内容时:

05-11 20:16:04.310: I/data(4542): content://media/external/video/media/287

但是没有档案。

2 个答案:

答案 0 :(得分:1)

最后用这段代码我可以获取文件。选择视频的uri并将具有所需名称的视频复制到文件夹

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("CODES", "" + requestCode + ", " + resultCode + ", " + data);
        if (requestCode == RESULT_VIDEO_REALIZADO && resultCode == RESULT_OK) {



            String filePath = null;
            Uri _uri = data.getData();
            Log.d("", "URI = " + _uri);
            if (_uri != null && "content".equals(_uri.getScheme())) {
                Cursor cursor = this
                        .getContentResolver()
                        .query(_uri,
                                new String[] { android.provider.MediaStore.Video.VideoColumns.DATA },
                                null, null, null);
                cursor.moveToFirst();
                filePath = cursor.getString(0);
                cursor.close();
            } else {
                filePath = _uri.getPath();
            }
            Log.d("", "Chosen path = " + filePath);
            if (!file.exists()) {
                copyFile(filePath, file.toString());
                Log.i("COPY", "Copy: " + videoUri.toString() + " a "
                        + file.toString());
            }
            Log.i("uriVid", videoUri.getPath());

    }


private void copyFile(String inputFile, String outputFile) {

    InputStream in = null;
    OutputStream out = null;
    try {

        // create output directory if it doesn't exist
        File dir = new File(folder.toString());
        if (!dir.exists()) {
            dir.mkdirs();
        }

        in = new FileInputStream(inputFile);
        out = new FileOutputStream(outputFile);

        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
        in.close();
        in = null;

        // write the output file (You have now copied the file)
        out.flush();
        out.close();
        out = null;

    } catch (FileNotFoundException fnfe1) {
        Log.e("tag", fnfe1.getMessage());
    } catch (Exception e) {
        Log.e("tag", e.getMessage());
    }

}

答案 1 :(得分:0)

视频录像机将视频保存到默认位置。也许这是因为mVideoUrl没有指向您期望它指向的位置。我想这可能是因为您假设文件系统使用/作为文件夹分隔符。

尝试更改:

file = new File(folder.getAbsolutePath() + "/" + videoName);

有:

file = new File(folder, videoName);

并通过调用

检查该文件是否能够被写入
file.canWrite();

见[http://developer.android.com/reference/java/io/File.html#File(java.io.File,%20java.lang.String)]