2011-01-13 126 views
0

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

而且我也有我的清单设置以下权限。 xml文件:

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

回答

8

愚蠢的错误在这里对不起,它没有工作,因为我的手机安装在我的笔记本电脑,所以它实际上无法达到SD卡。

3

对于错误2:尝试使用getExternalStorageDirectory(),而不是“SD卡”静态,也许路径无效/到达您的设备上。

1

对于那些偶然发现的问题,异常并不总是告诉你FileNotFoundException与拒绝权限相关联。检查您的AndroidManifest.xml中是否存在权限WRITE_EXTERNAL_STORAGE。在OP的情况下,它的确如此。

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

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");

它的作品对我来说

1

我敢打赌,一些人失踪写权限的清单。

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

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