MediaRecorder不保存文件

时间:2015-05-23 10:11:54

标签: java android camera mediarecorder

我已经看过其他人遇到这个问题并且找不到合适的解决方案。 和他们一样,我遵循了http://developer.android.com/guide/topics/media/camera.html的相机功能教程。 下面列出的所有内容都完美无缺,我认为该程序已按照我的意图录制了视频。但是,在查看图库中的视频时,它还没有出现。我很困惑,因为连接USB调试时没有IOExceptions或其他错误。奇怪的是,在移除USB并再次插入USB时,无论是立即还是在将来某些日子,所有先前录制的视频都会出现在图库中。显然,我有些遗漏的东西或录制视频的某些方面,我不知道。非常感谢任何帮助或指导,谢谢。

相关代码如下,如果有人需要,我会发布更多内容。

相机活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);

    mCamera = MainActivity.getCameraInstance();
    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);
    button_capture = (Button) findViewById(R.id.button_capture);
    button_capture.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (isRecording) {
                        // stop recording and release camera
                        mMediaRecorder.stop();  // stop the recording
                        releaseMediaRecorder(); // release the MediaRecorder object
                        mCamera.lock();         // take camera access back from MediaRecorder

                        // inform the user that recording has stopped
                        button_capture.setText("Capture");
                        isRecording = false;
                    } else {
                        // initialize video camera
                        if (prepareVideoRecorder()) {
                            // Camera is available and unlocked, MediaRecorder is prepared,
                            // now you can start recording
                            mMediaRecorder.start();

                            // inform the user that recording has started
                            button_capture.setText("Stop");
                            isRecording = true;
                        } else {
                            // prepare didn't work, release the camera
                            releaseMediaRecorder();
                            // inform user
                        }
                    }
                }
            });
}

private boolean prepareVideoRecorder(){

    mMediaRecorder = new MediaRecorder();

    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);

    // Step 2: Set sources
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    // Step 4: Set output file
    mMediaRecorder.setOutputFile(MediaCapture.getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

    // Step 5: Set the preview output
    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}

媒体捕获:

public static Uri getOutputMediaFileUri(int type) {
    return Uri.fromFile(getOutputMediaFile(MEDIA_TYPE_VIDEO));
}

/**
 * Create a File for saving an image or video
 */
public static File getOutputMediaFile(int type) {
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_MOVIES), "MyApplication");

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("MyApplication", "failed to create directory");
            return null;
        }
    }

        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HH:mm:ss").format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_VIDEO) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "VID_" + timeStamp + ".mp4");
        } else {
            return null;
        }
        return mediaFile;
    }
}

1 个答案:

答案 0 :(得分:0)

我也对此行为感到非常困惑,直到我意识到拔掉USB导致文件出现。这似乎是Android中的一个错误,可能与此相关:

https://code.google.com/p/android/issues/detail?id=195362

显然,文件已正确写入,但由于某种原因,新文件不可见。在任何情况下,上面链接中提供的解决方案/解决方法是强制对文件进行媒体扫描。 e.g。

MediaScannerConnection.scanFile(getContext(), new String[]{this.mediaFile.getAbsolutePath()}, null, null);

媒体文件'是mediaRecorder刚写完的文件。有了这个,我不需要拔下USB线来看文件,它会在录制结束后立即显示。

我在三星Galaxy A5上运行Android 5.0.2。这更像是一种解决方法,而不是修复方法,我无法确定它是否可以在其他设备或Android版本上运行,但我希望它可以帮助某人。