1

アプリからビデオをキャプチャするための Android デベロッパー ガイドのコード サンプルに従っています。インスタンスでprepareメソッドを呼び出すまで、物事は非常にスムーズです。次のメッセージをMediaRecorderスローします。IOException

java.io.FileNotFoundException: /file:/storage/emulated/0/Pictures/MyApp/MyVideoFile.mp4: 
open failed: ENOENT (No such file or directory)

コードはサイトのものとほとんど同じです。要約すると、次のとおりです。

  • CameraActivityCamera および MediaRecorder リソースを管理するためのクラス。

  • FileManagerビデオ プレビュー フレームの格納に使用される出力ファイル パスの Uri を返すクラス。

コードスニペット:

public static File getOutputMediaFile(int type) throws Exception {
        if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            throw new Exception("Unable to access device SDCard.");
        }

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), "MyApp");

    if(! mediaStorageDir.exists()) {
        if(! mediaStorageDir.mkdirs()) {
            Log.d(CameraActivity.MYAPP, "Failed to create directory.");
        }
    }

    // Create a media file name.
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath(),
        "MyAudioFile.jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath(),
        "MyVideoFile.mp4");
    } else {
        return null;
    }

    return mediaFile;
}

mediaFileメソッドに引数として渡されます_mediaRecorder.setOutputFile()。ただし、 を呼び出す_mediaRecorder.prepare()と、 がスローされIOExceptionます。

私はすでに<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />AndroidManifest ファイルに含めています。

驚くべき点は、呼び出しを省略しmediaRecorder.prepareてSDカードにファイルが存在するかどうかを確認すると、そこにあるということです!! ただし、上記のコードを最後まで実行してフォルダーを確認すると、ファイルはありません。ファイルが_mediaRecorder.prepare呼び出しによって削除されているようです!!

私は Android 開発にかなり慣れていないので、これを理解しようとしてすでに 1 日以上費やしています。どんな助けでも大歓迎です!!

4

2 に答える 2

3

このhttp://developer.android.com/guide/topics/media/camera.html#capture-videoの例に従いましたが、同じ問題がありました。

ここでの問題は、ディレクトリを作成してファイル名を作成するメソッドが File を返しましたが、後で Uri を返す別のメソッドによってラップされたことです。Uri は、ファイル パス文字列に「/file:」を追加しました。URI によって返された文字列を mediaRecorder.setOutputFile(..) に渡すと、prepare 関数呼び出しで例外がスローされました。

ビデオファイルを取得して ToString() を呼び出してそのパスを取得し、それを mediaRecorder.setOutputFile(..); に渡すだけで修正しました。その後、準備()が機能しました

于 2014-09-08T15:29:56.220 に答える
0

エミュレーターを使用している場合は、SD カードの容量を 1024MB に増やしてください。この影響を受けているかどうかも確認してください: WRITE_MEDIA_STORAGE http://www.chainfire.eu/articles/113/Is_Google_blocking_apps_writing_to_SD_cards_/

その他: https://android.googlesource.com/platform/packages/providers/MediaProvider/+/android-4.1.2_r2.1/AndroidManifest.xml

于 2013-11-07T13:57:18.193 に答える