2017-04-06 4 views
1

Ich spiele und notiere gleichzeitig ein Audio, um eine Audio-Matching-Analyse mit musicg API durchzuführen. Ich erhalte die folgenden Fehler/s jedes Mal wenn ich betreiben meinen App:Android: Keine solche Datei oder Verzeichnis gefunden Fehler?

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 

Ich versuche, um die Aufnahme zu einer Datei zu speichern und übergibt es dann an getScore() -Methode, um es das Original zu vergleichen Audiodatei gespielt und eine übereinstimmende Punktzahl zurückgeben. Unten ist der relevante Code in meiner MainActivity mit den Zeilen, die den Fehler in Fettschrift angeben.

EDIT 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); 
     } 
+0

Schauen Sie sich an, wie Sie den Dateinamen in 'getFilename()' erstellen. Wenn Sie das zweimal im Abstand von einer Millisekunde aufrufen, wird jedes Mal ein anderer Dateiname zurückgegeben. Außerdem wird "R.raw.forrest_gump_theme" 'kein gültiger Dateiname sein. Sie können nicht auf Ressourcen zugreifen, als wären sie Dateien. –

+0

@MikeM. Ich bin nicht 100% klar im ersten Teil Ihrer Antwort. Ich rufe getFilename() zweimal auf (einmal in getScore() und einmal in stopRecording), ist das die Wurzel meines Problems? Wie kann ich auf Ressourcen zugreifen, wenn ich den Dateinamen nicht direkt aufrufen kann? Kann bitte mehr Details zur Verfügung stellen. – Zack

+0

Sie verwenden 'System.currentTimeMillis()' in Ihrem Dateinamen. Wenn sich die aktuelle Zeit ändert, ändert sich auch die von 'getFilename()' zurückgegebene 'String '. Speichern Sie den vom ersten Aufruf zurückgegebenen Wert. Sie können auch einen 'InputStream' für eine rohe Ressource mit' getResources(). OpenRawResource() 'aufrufen, der auf Ihrer' Activity' oder einem anderen 'Context' aufgerufen wird. –

Antwort

1

Ich denke, das Problem in copyWaveFile ist():

Sie senden mFileName Variable copyWaveFile(), aber ändert seinen Weg folgenden Code:

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

Versuchen Sie, die obige Zeile zu entfernen, und überprüfen Sie noch einmal. Lassen Sie mich wissen, ob der gleiche Fehler weiterhin besteht.

+0

Ich bekomme den gleichen Fehler für die zweite Datei (fis2). Ich denke, ich rufe die rohe Audiodatei aus dem Ressourcenordner falsch auf. "String fileName2 =" R.raw.forrest_gump_theme ";", was ist der richtige Weg? – Zack

+1

Bitte überprüfen Sie den folgenden Link für Raw-Datei: http://StackOverflow.com/Questions/16741433/how-to-open-a-file-in-raw-folder-in-android – Sonam

Verwandte Themen