0

내 응용 프로그램에 오디오 레코더 클래스가 있습니다. 그것은 이전에 잘 일하고 내 HTC 욕망에 잘 작동하지만 지금은 내 LG에서 작동하지 않습니다. 더 이상 오디오 파일을 필요한 경로에 저장하지 않습니다. 나는 그것이 전화를 걸려 넘어지는 것을 생각하고있다. 그러나 나는 틀릴 것이다. writeAudioDataFiletry-catch 블록에AudioRecorder가 더 이상 작동하지 않습니다. FileNotFoundException : 사용 권한이 거부되었습니다.

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

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

      File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE); 

      if(tempFile.exists()){ 
        tempFile.delete(); 
      } 

      return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE); 
    } 

private void writeAudioDataToFile(){ 
      byte data[] = new byte[bufferSize]; 
      String filename = getTempFilename(); 
      FileOutputStream os = null; 

      try { 
        os = new FileOutputStream(filename); 
      } catch (FileNotFoundException e) { 
        System.out.println("error"); 
        e.printStackTrace(); 
      } 

      int read = 0; 

      if(null != os){ 
        while(isRecording){ 

          read = recorder.read(data, 0, bufferSize); 

          if(AudioRecord.ERROR_INVALID_OPERATION != read){ 
            try {        
             os.write(data); 

            } 
            catch (Exception e) { 
              e.printStackTrace(); 
            } 
          } 
        } 

        try { 
          os.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 

private void stopRecording(){ 
      if(null != recorder){ 
        isRecording = false; 

        recorder.stop(); 
        recorder.release(); 

        recorder = null; 
        recordingThread = null; 
      } 

      copyWaveFile(getTempFilename(),getFilename()); 
      deleteTempFile(); 
    } 

private void copyWaveFile(String inFilename,String outFilename){ 
      FileInputStream in = null; 
      FileOutputStream out = null; 
      long totalAudioLen = 0; 
      long totalDataLen = totalAudioLen + 36; 
      long longSampleRate = RECORDER_SAMPLERATE; 
      int channels = 2; 
      long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8; 

      byte[] data = new byte[bufferSize]; 

      try { 
        in = new FileInputStream(inFilename); 
        out = new FileOutputStream(outFilename); 
        totalAudioLen = in.getChannel().size(); 
        totalDataLen = totalAudioLen + 36; 

        //AppLog.logString("File size: " + totalDataLen); 

        WriteWaveFileHeader(out, totalAudioLen, totalDataLen, 
            longSampleRate, channels, byteRate); 

        while(in.read(data) != -1){ 
          out.write(data); 
        } 

        in.close(); 
        out.close(); 
        GlobalVar appState = ((GlobalVar)getApplicationContext()); 
        appState.addAudioFile(outFilename); 
      } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 

오류 로그 filenameFileOutputStream를 인스턴스화 할 때

오류가 발생합니다 : 최신 버전의

01-25 15:46:08.143: W/System.err(1828): java.io.FileNotFoundException: /mnt/sdcard/GeneralGUI2/Study1/Music/record_temp.raw (Permission denied) 
01-25 15:46:08.143: W/System.err(1828):  at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method) 
01-25 15:46:08.143: W/System.err(1828):  at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152) 
01-25 15:46:08.143: W/System.err(1828):  at java.io.FileInputStream.<init>(FileInputStream.java:82) 
01-25 15:46:08.143: W/System.err(1828):  at java.io.FileInputStream.<init>(FileInputStream.java:134) 
01-25 15:46:08.143: W/System.err(1828):  at mfc.generalguixapi8.AudioActivity2.copyWaveFile(AudioActivity2.java:239) 
01-25 15:46:08.143: W/System.err(1828):  at mfc.generalguixapi8.AudioActivity2.stopRecording(AudioActivity2.java:217) 
01-25 15:46:08.143: W/System.err(1828):  at mfc.generalguixapi8.AudioActivity2.access$1(AudioActivity2.java:206) 
01-25 15:46:08.153: W/System.err(1828):  at mfc.generalguixapi8.AudioActivity2$2.onClick(AudioActivity2.java:126) 
01-25 15:46:08.153: W/System.err(1828):  at android.view.View.performClick(View.java:2408) 
01-25 15:46:08.153: W/System.err(1828):  at android.view.View$PerformClick.run(View.java:8816) 
01-25 15:46:08.153: W/System.err(1828):  at android.os.Handler.handleCallback(Handler.java:587) 
01-25 15:46:08.153: W/System.err(1828):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-25 15:46:08.153: W/System.err(1828):  at android.os.Looper.loop(Looper.java:123) 
01-25 15:46:08.153: W/System.err(1828):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-25 15:46:08.153: W/System.err(1828):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 15:46:08.153: W/System.err(1828):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-25 15:46:08.153: W/System.err(1828):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-25 15:46:08.153: W/System.err(1828):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
01-25 15:46:08.153: W/System.err(1828):  at dalvik.system.NativeStart.main(Native Method) 

답변

1

을, 당신은 명시 적 WRITE_EXTERNAL_STORAGE 권한이 필요합니다.

또한 외부 저장 장치의 루트에 쓸 수 없습니다. 따라서 폴더를 만든 다음 해당 폴더에 기록하십시오.

+0

이미 내 매니페스트 파일에 해당 권한이 있습니다. 그리고 나는 이미 루트가 아닌 폴더에 글을 쓰고 있습니다. – Neeta

+0

경로를 기록하고 여기에 붙여 넣을 수 있습니까? –

+0

방금 ​​오류 로그를 추가했습니다. 위의 설명을 작성하고 편집 한 경로가 표시됩니다. 오류는 내가 생각한 곳이 아닙니다. – Neeta