簡體   English   中英

嘗試訪問Android外部存儲時出現FileNotFoundException

[英]FileNotFoundException while trying to access external storage Android

我正在關注Android開發人員指南中的代碼示例,以便從我的應用中捕獲視頻 在我調用MediaRecorder實例上的prepare方法之前,情況非常順利。 它拋出IOException並顯示以下消息:

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

代碼與網站上的代碼幾乎相同。 總結一下,有:

  • 用於管理Camera和MediaRecorder資源的CameraActivity類。

  • 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

我已在AndroidManifest文件中包含<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

令人驚訝的是,如果我省略了mediaRecorder.prepare調用並檢查sdcard是否存在該文件,它就在那里! 但是,如果我運行上面的代碼完成並檢查文件夾,該文件不存在。 看來文件被_mediaRecorder.prepare調用刪除!!

我是Android開發的新手,已經花了一天多的時間試圖解決這個問題。 任何幫助都將受到極大的重視!

我已經按照http://developer.android.com/guide/topics/media/camera.html#capture-video示例進行了操作,並遇到了同樣的問題。

那里的問題是,創建目錄和構造文件名的方法返回了一個文件,但后來由另一個返回Uri的方法包裝。 Uri將“/ file:”添加到文件路徑字符串中。 將URI返回的字符串傳遞給mediaRecorder.setOutputFile(..),使prepare函數調用拋出異常。

我通過簡單地獲取視頻文件並調用ToString()來獲取其路徑並將其傳遞給mediaRecorder.setOutputFile(..); 然后prepare()工作了

如果您使用的是模擬器,請將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM