0

我正在开发一个应用程序,当用户按下某个按钮时,我想打开相机来录制视频。

这是我启动相机的方法:

public void recordVideo(boolean highQuality) {
    if (isIntentAvailable(MediaStore.ACTION_VIDEO_CAPTURE)) {

        videoFile = createFile(MEDIA_TYPE_VIDEO);

        if(videoFile != null){
            videoFileUri = Uri.fromFile(videoFile);

            Intent recordVideo = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

            recordVideo.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                    videoFileUri);
            recordVideo.putExtra(
                    android.provider.MediaStore.EXTRA_VIDEO_QUALITY,
                    highQuality ? 1 : 0);
            recordVideo.putExtra(
                    android.provider.MediaStore.EXTRA_DURATION_LIMIT, 30);

            cameraStarted = true;
            startActivityForResult(recordVideo, ACTION_TAKE_VIDEO);
        }
    } else {
        Toast.makeText(this, R.string.no_camera, Toast.LENGTH_SHORT).show();
    }
}

在这里我制作文件:

private File createFile(int type) {
    File mediaFile = null;

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

        File mediaStorageDir = new File(
                Environment.getExternalStorageDirectory() + "/Zorgdossier", "Media");
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d(TAG, "failed to create directory");
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.getDefault()).format(new Date());

        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + "/" + "IMG_"
                    + timeStamp + ".jpg");
        } else if (type == MEDIA_TYPE_VIDEO) {
            mediaFile = new File(mediaStorageDir.getPath() + "/" + "VID_"
                    + timeStamp + ".mp4");
        } else {
            return null;
        }
    }
    else{
        Log.d(TAG, "No external storage found");
        Toast.makeText(this, getString(R.string.storageNotAvailable), Toast.LENGTH_SHORT).show();
    }

    return mediaFile;
}

当我录制视频并按下保存按钮时,应用程序崩溃并出现以下错误:

这是错误堆栈:

E/AndroidRuntime( 3972): FATAL EXCEPTION: main
E/AndroidRuntime( 3972): java.lang.NullPointerException
E/AndroidRuntime( 3972):    at java.io.File.fixSlashes(File.java:205)
E/AndroidRuntime( 3972):    at java.io.File.init(File.java:189)
E/AndroidRuntime( 3972):    at java.io.File.<init>(File.java:139)
E/AndroidRuntime( 3972):    at com.sec.android.app.camera.CamcorderEngine.renameTempFile(CamcorderEngine.java:1132)
E/AndroidRuntime( 3972):    at com.sec.android.app.camera.CamcorderEngine.doStopVideoRecordingSync(CamcorderEngine.java:772)
E/AndroidRuntime( 3972):    at com.sec.android.app.camera.CeStateRecording.handleRequest(CeStateRecording.java:69)
E/AndroidRuntime( 3972):    at com.sec.android.app.camera.CeRequestQueue.startFirstRequest(CeRequestQueue.java:104)
E/AndroidRuntime( 3972):    at com.sec.android.app.camera.CeRequestQueue.access$300(CeRequestQueue.java:32)
E/AndroidRuntime( 3972):    at com.sec.android.app.camera.CeRequestQueue$MainHandler.handleMessage(CeRequestQueue.java:54)
E/AndroidRuntime( 3972):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3972):    at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime( 3972):    at android.app.ActivityThread.main(ActivityThread.java:3687)
E/AndroidRuntime( 3972):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3972):    at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 3972):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
E/AndroidRuntime( 3972):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
E/AndroidRuntime( 3972):    at dalvik.system.NativeStart.main(Native Method)

任何想法是什么导致这个错误?奇怪的是,录制的视频正确地保存在我指定的地图中。

编辑:这是在三星银河 gio 上测试的。

4

1 回答 1

0

我在这里找到了答案,显然 MediaStore.EXTRA_OUTPUT 不能正常工作。

于 2012-11-14T13:40:00.947 回答