启动媒体记录器时出现 IllegalStateException
IllegalStateException while starting Media recorder
我在应用程序中获取振幅时遇到问题。
我的开始方法
public void start() {
if (mRecorder == null) {
try {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
mRecorder.setOutputFile("/dev/null");
try {
mRecorder.prepare();
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
mRecorder = null;
} catch(IllegalStateException e ){
e.printStackTrace();
mRecorder = null;
}
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
还有我的停止方法:
public void stop() {
if (mRecorder != null) {
try {
mRecorder.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
} finally {
mRecorder.release();
}
mRecorder = null;
}
}
它在
上抛出 IllegalStateException
mRecorder.start();
我尝试了不同的 OutputFormats 和 AudioEncoders,但其中 none 可以正常工作。 :/ 也在不同的手机上试过。
这是我的堆栈跟踪。
W/MediaRecorder: mediarecorder went away with unhandled events
E/MediaRecorder: start failed: -38
W/System.err: java.lang.IllegalStateException
W/System.err: at android.media.MediaRecorder.start(Native Method)
W/System.err: at com.oscarsenior.oscar.util.sensorHelpers.SoundMeter.start(SoundMeter.java:33)
W/System.err: at com.oscarsenior.oscar.util.service.SensorService.updateAmplitude(SensorService.java:616)
W/System.err: at com.oscarsenior.oscar.util.service.SensorService.onSensorChanged(SensorService.java:606)
我运行每15分钟测量一次,持续3秒,测量最大振幅。
首先允许权限
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
然后是start()方法
MediaRecorder mRecorder;
File file;
public void start() {
if (mRecorder == null) {
try {
mRecorder = new MediaRecorder();
file = new File(Environment.getExternalStorageDirectory() + "/Demo");
if (!file.exists())
file.mkdir();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(file.getAbsoluteFile() + "/demoAudio.mp3");
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//mRecorder.setOutputFile();
try {
mRecorder.prepare();
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
mRecorder = null;
} catch (IllegalStateException e) {
e.printStackTrace();
mRecorder = null;
}
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
然后是 Stop() 方法
public void stop() {
if (mRecorder != null) {
try {
mRecorder.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
} finally {
mRecorder.release();
}
mRecorder = null;
}
}
并且当应用程序在后台使用此方法时也停止录制
@Override
protected void onStop() {
super.onStop();
stop();
}
我终于找到了解决问题的方法。
问题出在我的服务上。我使用相同的 MediaRecorder.AudioSource 同时使用 MediaRecorder 两次。
解决方法是对这两种情况使用相同的 mRecorder。
所以我从 SoundMeter class.
创建了 Singleton
protected SoundMeter(){
}
public static SoundMeter getInstance(){
if(instance == null){
instance = new SoundMeter();
}
if(!instance.isRecording || instance.mRecorder == null){
instance.start();
}
return instance;
}
所以我得到 SoundMeter 的实例,如果带有 mRecorder 的实例没有初始化,我将使用相同的 所讨论的 SoundMeter.start() 方法。
我在stop()方法中添加了mRecorder.reset(),所以释放mRecorder 将清除其状态。也许我可以在完成后释放 MediaRecorder,而不是每次我停止收听一段时间,但我宁愿在不需要时在后台释放一些内存。
if (mRecorder != null) {
try {
mRecorder.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
} finally {
mRecorder.reset();
mRecorder.release();
}
mRecorder = null;
isRecording = false;
}
我在应用程序中获取振幅时遇到问题。
我的开始方法
public void start() {
if (mRecorder == null) {
try {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
mRecorder.setOutputFile("/dev/null");
try {
mRecorder.prepare();
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
mRecorder = null;
} catch(IllegalStateException e ){
e.printStackTrace();
mRecorder = null;
}
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
还有我的停止方法:
public void stop() {
if (mRecorder != null) {
try {
mRecorder.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
} finally {
mRecorder.release();
}
mRecorder = null;
}
}
它在
上抛出 IllegalStateExceptionmRecorder.start();
我尝试了不同的 OutputFormats 和 AudioEncoders,但其中 none 可以正常工作。 :/ 也在不同的手机上试过。
这是我的堆栈跟踪。
W/MediaRecorder: mediarecorder went away with unhandled events
E/MediaRecorder: start failed: -38
W/System.err: java.lang.IllegalStateException
W/System.err: at android.media.MediaRecorder.start(Native Method)
W/System.err: at com.oscarsenior.oscar.util.sensorHelpers.SoundMeter.start(SoundMeter.java:33)
W/System.err: at com.oscarsenior.oscar.util.service.SensorService.updateAmplitude(SensorService.java:616)
W/System.err: at com.oscarsenior.oscar.util.service.SensorService.onSensorChanged(SensorService.java:606)
我运行每15分钟测量一次,持续3秒,测量最大振幅。
首先允许权限
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
然后是start()方法
MediaRecorder mRecorder;
File file;
public void start() {
if (mRecorder == null) {
try {
mRecorder = new MediaRecorder();
file = new File(Environment.getExternalStorageDirectory() + "/Demo");
if (!file.exists())
file.mkdir();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(file.getAbsoluteFile() + "/demoAudio.mp3");
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//mRecorder.setOutputFile();
try {
mRecorder.prepare();
mRecorder.start();
} catch (IOException e) {
e.printStackTrace();
mRecorder = null;
} catch (IllegalStateException e) {
e.printStackTrace();
mRecorder = null;
}
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
然后是 Stop() 方法
public void stop() {
if (mRecorder != null) {
try {
mRecorder.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
} finally {
mRecorder.release();
}
mRecorder = null;
}
}
并且当应用程序在后台使用此方法时也停止录制
@Override
protected void onStop() {
super.onStop();
stop();
}
我终于找到了解决问题的方法。
问题出在我的服务上。我使用相同的 MediaRecorder.AudioSource 同时使用 MediaRecorder 两次。
解决方法是对这两种情况使用相同的 mRecorder。
所以我从 SoundMeter class.
创建了 Singletonprotected SoundMeter(){
}
public static SoundMeter getInstance(){
if(instance == null){
instance = new SoundMeter();
}
if(!instance.isRecording || instance.mRecorder == null){
instance.start();
}
return instance;
}
所以我得到 SoundMeter 的实例,如果带有 mRecorder 的实例没有初始化,我将使用相同的 所讨论的 SoundMeter.start() 方法。
我在stop()方法中添加了mRecorder.reset(),所以释放mRecorder 将清除其状态。也许我可以在完成后释放 MediaRecorder,而不是每次我停止收听一段时间,但我宁愿在不需要时在后台释放一些内存。
if (mRecorder != null) {
try {
mRecorder.stop();
} catch (RuntimeException stopException) {
//handle cleanup here
} finally {
mRecorder.reset();
mRecorder.release();
}
mRecorder = null;
isRecording = false;
}