AudioRecorder больше не работает. FileNotFoundException: в доступе отказано - PullRequest
0 голосов
/ 25 января 2012

В моем приложении есть класс аудиозаписывающего устройства. Ранее он работал нормально и отлично работает на моем HTC Desire, но теперь не работает на моем LG. Это больше не сохраняет аудиофайл по требуемому пути. Я думаю, что это какая-то настройка на телефоне, которая отключает его, но я, вероятно, ошибаюсь.

Ошибка возникает, когда writeAudioDataFile создает экземпляр FileOutputStream с filename в блоке try-catch

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();
            }
    }

Журнал ошибок:

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 Ответ

1 голос
/ 25 января 2012

Для более новых версий вам необходимо явное разрешение WRITE_EXTERNAL_STORAGE.

Кроме того, вам не разрешено писать в корень внешнего устройства хранения. Итак, попробуйте создать папку, а затем запишите в эту папку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...