Не удается открыть .mp3 аудиозапись java.io.FileNotFoundException

#android #file #audio #mobile #android-mediaplayer

#Android #файл #Аудио #Мобильный #android-медиаплеер

Вопрос:

В моем проекте есть функция, которая позволяет пользователю записывать и воспроизводить аудиозапись, которая хранится локально. Если я установлю статическое имя для файла, все будет работать нормально. Если я пытаюсь установить динамическое имя (например: System.currentTimeMillis()), файл не найден, когда я пытаюсь его воспроизвести. Вот мой код:

Бит записи:

     public void startRecording() {

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(output_formats[currentFormat]);
    // recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(getFileRecording());
    recorder.setOnErrorListener(errorListener);
    recorder.setOnInfoListener(infoListener);

    try {
        recorder.prepare();
        recorder.start();
        isRecording = true;
        showRecordingUI();

        handler.post(updateVisualizer);

    } catch (IllegalStateException e) {
        Log.e("Recording ::::: ", e.getMessage());
        e.printStackTrace();
    } catch (IOException e) {
        Log.e("Recording :: ", e.getMessage());
        e.printStackTrace();
    }

    BuildDev.logDebug("WE ARE RECORDING!!!");


}
  

и настройки имени файла (статическое имя):

     private String getFileRecording() {
    recordingFilepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(recordingFilepath, AUDIO_RECORDER_FOLDER);

    if (!file.exists()) {
        file.mkdirs();
    }

    String fileName = "12345"

    return (file.getAbsolutePath()   "/"   fileName   file_exts[currentFormat]);
}
  

это путь, который я получаю при отладке:

 /storage/emulated/0/everreach_audio_notes//12345.mp3
  

и нединамическая опция, которая, похоже, не работает:

     private String getFileRecording() {
    recordingFilepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(recordingFilepath, AUDIO_RECORDER_FOLDER);

    if (!file.exists()) {
        file.mkdirs();
    }

    String fileName =  String.valueOf(System.currentTimeMillis();

    return (file.getAbsolutePath()   "/"   "/"   fileName   file_exts[currentFormat]);
}
  

который дает мне следующий путь:

 /storage/emulated/0/everreach_audio_notes//1476878040697.mp3
  

Когда я пытаюсь воспроизвести аудиофайл с динамическим именем, я получаю эту ошибку:

 W/System.err: java.io.FileNotFoundException: /storage/emulated/0/everreach_audio_notes/11476880948244.mp3: open failed: ENOENT (No such file or directory)
at java.io.FileInputStream.<init>(FileInputStream.java:76)
at java.io.FileInputStream.<init>(FileInputStream.java:103)
call_info.RecordingsListAdapter.startPlaying(RecordingsListAdapter.java:190)
call_info.RecordingsListAdapter.access$500(RecordingsListAdapter.java:36)
call_info.RecordingsListAdapter$2.onClick(RecordingsListAdapter.java:125)
at android.view.View.performClick(View.java:4861)
at android.view.View$PerformClick.run(View.java:19980)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5373)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:451)
  

Комментарии:

1. Попробуйте удалить одну косую черту в path? Чтобы иметь /storage/emulated/0/audio_notes/1476878040697.mp3?

2. не запускается попытка чтения из файла, полученного иным способом, чем упомянутый здесь? Обратите внимание, что он пытается открыть файл в каталоге everreach_audio_notes, а не audio_notes

3. Привет, премек, извините, что это была опечатка с моей стороны

4. добавьте журнал в getFileRecording перед возвратом и предоставьте обновленный журнал

Ответ №1:

Заменить

   return (file.getAbsolutePath()   "/"   "/"   fileName   file_exts[currentFormat]);
  

Автор:

   return (file.getAbsolutePath()   "/"   fileName   file_exts[currentFormat]);
  

Комментарии:

1. java.io.FileNotFoundException: /storage/emulated/0/audio_notes/11476884497361.mp3: открыть не удалось: ENOENT (нет такого файла или каталога). Я пробовал, он ничего не делает.

2. файлы существуют в памяти телефона

3. Да, путь тот же

4. «/» все еще есть в обновленном вопросе // это делает неправильный путь

5. Я разбираюсь. Первая проблема заключалась в том, что у меня была дополнительная «/», а вторая проблема заключалась в том, что System.currentTimeMillis() была другой. Приносим извинения за возникшие неудобства.

Ответ №2:

проверьте трассировку стека еще раз

  java.io.FileNotFoundException:  /storage/emulated/0/everreach_audio_notes/11476880948244.mp3: open failed: ENOENT (No such file or directory)
  

и вы говорите, что получаете

 /storage/emulated/0/audio_notes//1476878040697.mp3 
  

из getFileRecording() метода

/everreach_audio_notes/ и /audio_notes/ не то же самое

Комментарии:

1. Прошу прощения, это была опечатка с моей стороны

2. проверьте все еще раз и предоставьте точные данные, если вам нужна помощь … никто не сможет помочь, если вопрос неправильный