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)

このエラーの原因となるアイデアはありますか?奇妙なことに、録画したビデオは、指定したマップに正しく保存されます。

編集:これはサムスンギャラクシージオでテストされました。

4

1 に答える 1

0

ここで答えを見つけました。どうやらMediaStore.EXTRA_OUTPUTが正しく機能していません。

于 2012-11-14T13:40:00.947 に答える