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