录音的许可问题

时间:2011-01-13 10:15:06

标签: java android media audio-recording

我在设备上录制声音时遇到了一些问题。我从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" />

5 个答案:

答案 0 :(得分:8)

愚蠢错误在这里抱歉,它没有用,因为我的笔记本电脑上安装了手机,因此实际上无法到达SD卡。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

即使您创建外部SD卡文件(使用mksdcard命令)并将其与您的手机关联,对getExternalStorageDirectory()的调用仍可能指向/ sdcard(因为该方法的合同不保证它将返回非内部存储位置)。您始终可以使用'adb shell'命令检查sdcard是否存在。如果要将文件复制到SD卡或从SD卡复制文件,请使用'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

答案 3 :(得分:1)

不要在输出文件中核实/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");

这对我有用

答案 4 :(得分:1)

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

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

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