【问题标题】:Permission problems for sound recording录音权限问题
【发布时间】:2011-06-08 09:53:23
【问题描述】:

我在设备上录制声音时遇到了一些问题。我使用的代码 if 来自 android 开发网站 (Site Link),如下所示:

    public void onClickStart(View v) throws IllegalStateException, IOException{
        startRecord();
    }

    public void onClickStop(View v) throws IllegalStateException, IOException{
        stopRecord();
    }

    private void startRecord() throws IllegalStateException, IOException{
        recorder = new MediaRecorder(); 
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);  //ok so I say audio source is the microphone, is it windows/linux microphone on the emulator? 
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
        recorder.setOutputFile("/sdcard/test.3gpp"); 
        recorder.prepare(); 
        recorder.start();  
    }

    private void stopRecord(){
        recorder.stop();
//      recorder.release();
    }

在主布局中有 2 个按钮,它可以同时停止和开始录制(理论上是这样)。

但是从 LogCat 在我的设备上尝试这个时(真的不能在模拟器上尝试)我收到以下错误:

Error 1:
ERROR/MediaRecorder(14541): start called in an invalid state: 4
java.lang.IllegalStateException: Could not execute method of the activity
Caused by: java.lang.reflect.InvocationTargetException

Error 2:
Caused by: java.io.FileNotFoundException: /sdcard/test.3gpp (Permission denied)

我还在我的 Manifest.xml 文件中设置了以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【问题讨论】:

    标签: java android media audio-recording


    【解决方案1】:

    这里是愚蠢的错误,抱歉,它不起作用,因为我的笔记本电脑上安装了手机,所以它实际上无法访问 sdcard。

    【讨论】:

      【解决方案2】:

      对于错误 2:尝试静态使用 getExternalStorageDirectory() 而不是“sdcard”,可能该路径在您的设备上无效/无法访问。

      【讨论】:

        【解决方案3】:

        对于偶然发现这一点的其他人,异常并不总是告诉您 FileNotFoundException 与拒绝权限相关联。检查您的 AndroidManifest.xml 中是否存在 WRITE_EXTERNAL_STORAGE 权限。在 OP 的情况下,确实如此。

        即使您创建了一个外部 SD 卡文件(使用 mksdcard 命令)并将其与您的手机相关联,对 getExternalStorageDirectory() 的调用仍可能指向 /sdcard(因为该方法的合同不保证它会返回非内部存储位置)。您始终可以使用“adb shell”命令检查 sdcard 是否存在。如果您想将文件复制到/从 sdcard,请使用“adb pull”/“adb push”命令。

        参考资料:

        http://developer.android.com/guide/developing/devices/emulator.html#sdcard

        How to copy and edit files in Android shell?

        writing to sdcard not working

        【讨论】:

          【解决方案4】:

          不要在输出文件中硬核/sdcard/test.3gpp,您应该使用getExternalStorage(),使用以下代码:

          boolean exists = (new File(android.os.Environment.getExternalStorageDirectory() + "/Record/")).exists();
          if (!exists) {
              new File(android.os.Environment.getExternalStorageDirectory() + "/Record/").mkdirs();
          }
          

          并将此路径设置为输出文件 recorder.setOutputFile(android.os.Environment.getExternalStorageDirectory()+"/Record/test.3gp");

          对我有用

          【讨论】:

            【解决方案5】:

            我敢打赌,有些人在清单中缺少写入权限。

            在主清单标签内,请确保您拥有以下权限:

            <uses-permission android:name="android.permission.RECORD_AUDIO"/>
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-18
              • 1970-01-01
              • 2019-08-11
              • 1970-01-01
              • 2010-09-24
              • 2018-01-06
              • 2011-08-18
              • 1970-01-01
              相关资源
              最近更新 更多