Android: такой файл или каталог не найден?

Я воспроизводю и записываю звук одновременно, чтобы выполнить анализ соответствия звука с помощью API-интерфейса musicg. Я получаю следующие ошибки каждый раз, когда запускаю свое приложение:

V/playRecordAudio: Playing sound & recording stopped
 W/System.err: java.io.FileNotFoundException: /storage/emulated/0: open failed: EISDIR (Is a directory)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment.copyWaveFile(SpeakersFragment.java:316)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment.stopRecording(SpeakersFragment.java:284)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment.access$200(SpeakersFragment.java:45)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment$3.onCompletion(SpeakersFragment.java:176)
W/System.err:     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2821)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:148) 
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/System.err: Caused by: android.system.ErrnoException: open failed: EISDIR (Is a directory)
W/System.err:     at libcore.io.Posix.open(Native Method)
W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err:   ... 14 more
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/AudioRecorder/1491446370522.wav: open failed: ENOENT (No such file or directory)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:103)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment.getScore(SpeakersFragment.java:399)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment.stopRecording(SpeakersFragment.java:285)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment.access$200(SpeakersFragment.java:45)
W/System.err:     at com.android.project1.main.fragments.SpeakersFragment$3.onCompletion(SpeakersFragment.java:176)
W/System.err:     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2821)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:148)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err:     at libcore.io.Posix.open(Native Method)
W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err:   ... 13 more
I/System.out: 0.0
W/MediaPlayer: mediaplayer went away with unhandled events

Я пытаюсь сохранить запись в файл, а затем передать ее методу getScore(), чтобы сравнить ее с исходным воспроизводимым аудиофайлом и вернуть соответствующую оценку. Ниже приведен соответствующий код в моем MainActivity со строками, выделенными жирным шрифтом.

РЕДАКТИРОВАТЬ 1:

String mFileName = getFilename();
...
private void stopRecording() {
            if (null != recorder) {
                isRecording = false;

                int i = recorder.getState();
                if (i == 1)
                    recorder.stop();
                recorder.release();

                recorder = null;
                recordingThread = null;
            }

            copyWaveFile(getTempFilename(), mFileName);
            getScore(); //error here
            deleteTempFile();
        }

public void getScore (){

            String fileName1 = mFileName;
            String fileName2 = "R.raw.forrest_gump_theme"; //Need to change this

            try {
                //InputStream fis1 = null, fis2 = null;
                InputStream fis1, fis2;
                fis1 = new FileInputStream(fileName1);//error here
                fis2 = new FileInputStream(fileName2);

                Wave wave1 = new Wave(fis1), wave2 = new Wave (fis2);
                FingerprintSimilarity similarity;

                similarity = wave1.getFingerprintSimilarity(wave2);
                result = similarity.getSimilarity()*100;


            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println(result);
        }

person Zack    schedule 06.04.2017    source источник
comment
Посмотрите, как вы создаете имя файла в getFilename(). Если вы вызовете это дважды, с интервалом в миллисекунду, он будет каждый раз возвращать другое имя файла. Кроме того, "R.raw.forrest_gump_theme" не будет допустимым именем файла. Вы не можете получить доступ к ресурсам, как если бы они были файлами.   -  person Mike M.    schedule 06.04.2017
comment
@МайкМ. Я не на 100% понимаю первую часть вашего ответа. Я вызываю getFilename() дважды (один раз в getScore() и один раз в stopRecording), в этом корень моей проблемы? Кроме того, как я могу получить доступ к ресурсам, если я не могу напрямую вызвать имя файла? Можете, пожалуйста, предоставить более подробную информацию.   -  person Zack    schedule 06.04.2017
comment
Вы используете System.currentTimeMillis() в имени файла. Если текущее время изменяется, то же самое происходит и с String, возвращаемым getFilename(). Сохраните значение, возвращенное при первом вызове. Кроме того, вы можете получить InputStream за необработанный ресурс с вызовом getResources().openRawResource() на вашем Activity или другом Context.   -  person Mike M.    schedule 06.04.2017
comment
@МайкМ. Пожалуйста, проверьте мой РЕДАКТИРОВАТЬ 1 в моем вопросе, я принял во внимание ваши комментарии. Кроме того, что касается файла ресурсов, будет ли правильным следующее: String fileName2 = getResources().openRawResource(R.raw.forrest_gump_theme); ?   -  person Zack    schedule 06.04.2017
comment
@МайкМ. Я думаю, было бы очень полезно, если бы вы могли опубликовать полный ответ, чтобы я мог выбрать его как достаточный для моего вопроса.   -  person Zack    schedule 06.04.2017


Ответы (1)


Я думаю, что проблема в copyWaveFile():

Вы отправляете переменную mFileName в copyWaveFile(), но меняете ее путь, используя следующий код:

 outFilename = Environment.getExternalStorageDirectory().getPath();

Попробуйте удалить строку выше и проверьте еще раз. Дайте мне знать, если та же ошибка повторится.

person Sonam    schedule 06.04.2017
comment
Я получаю ту же ошибку для второго файла (fis2). Я думаю, что неправильно вызываю необработанный аудиофайл из папки ресурсов. String fileName2 = R.raw.forrest_gump_theme;, как правильно это сделать? - person Zack; 07.04.2017
comment
Пожалуйста, проверьте ссылку ниже для исходного файла: stackoverflow.com/questions/16741433/ - person Sonam; 07.04.2017