Android停止录制失败
我要启动一个服务来开始录音。当我试图停止时,它显示以下消息Android停止录制失败,android,audio,recording,Android,Audio,Recording,我要启动一个服务来开始录音。当我试图停止时,它显示以下消息 06-27 17:21:30.138: E/MediaRecorder(6122): stop called in an invalid state: 0 我不确定上传数据到服务器等其他功能是否会影响结果(在Asyck任务中未实现,仅调用方法) 如果我没有捕获运行时异常,有时它可能会显示处理程序异常(完成活动,停止录制) 开始录音 06-28 09:14:47.646: E/MediaRecorder(3089): start fai
06-27 17:21:30.138: E/MediaRecorder(6122): stop called in an invalid state: 0
我不确定上传数据到服务器等其他功能是否会影响结果(在Asyck任务中未实现,仅调用方法)
如果我没有捕获运行时异常,有时它可能会显示处理程序异常(完成活动,停止录制)
开始录音
06-28 09:14:47.646: E/MediaRecorder(3089): start failed: -38
06-28 09:14:47.646: W/System.err(3089): java.lang.IllegalStateException
06-28 09:14:47.646: W/System.err(3089): at android.media.MediaRecorder.start(Native Method)
06-28 09:14:47.646: W/System.err(3089): at tvbpv.test.EOrderSystem1.RecordService.startRecording(RecordService.java:87)
06-28 09:14:47.646: W/System.err(3089): at tvbpv.test.EOrderSystem1.RecordService.onStart(RecordService.java:49)
06-28 09:14:47.646: W/System.err(3089): at android.app.Service.onStartCommand(Service.java:438)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2371)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread.access$1900(ActivityThread.java:127)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1222)
06-28 09:14:47.646: W/System.err(3089): at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 09:14:47.646: W/System.err(3089): at android.os.Looper.loop(Looper.java:137)
06-28 09:14:47.646: W/System.err(3089): at android.app.ActivityThread.main(ActivityThread.java:4519)
06-28 09:14:47.646: W/System.err(3089): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 09:14:47.646: W/System.err(3089): at java.lang.reflect.Method.invoke(Method.java:511)
06-28 09:14:47.646: W/System.err(3089): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
06-28 09:14:47.646: W/System.err(3089): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
06-28 09:14:47.646: W/System.err(3089): at dalvik.system.NativeStart.main(Native Method)
下面是我的代码
RecordService.java
private MediaRecorder recorder;
private File instanceRecord;
private boolean recording= false;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onStart(Intent intent, int startId) {
startRecording();
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
stopRecording();
super.onDestroy();
}
private void prepareRecording()
{
try
{
recorder.prepare();
}
catch(IllegalStateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void startRecording(){
try {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
Date today = Calendar.getInstance().getTime();
Format formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String reportDate = formatter.format(today);
File instanceRecordDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "TVB_PV_recordings");
if(!instanceRecordDirectory.exists()){
instanceRecordDirectory.mkdirs();
}
instanceRecord = new File(instanceRecordDirectory.getAbsolutePath() + File.separator + reportDate + "_sales_recording.mp4");
if(!instanceRecord.exists()){
instanceRecord.createNewFile();
}
recorder.setOutputFile(instanceRecord.getAbsolutePath());
prepareRecording();
recorder.start();
recording = true;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
public void stopRecording() {
if (recorder != null) {
try {
recorder.stop();
} catch(RuntimeException e) {
instanceRecord.delete(); //you must delete the outputfile when the recorder stop failed.
} finally {
recorder.release();
recorder = null;
}
}
}
Other Activity:
stopService(new Intent(EOrderSystemSubmit.this, RecordService.class));
-非常注意主题开头的图表。我敢肯定,录音未开始时,您正在呼叫停止
停止录制。在start()之后调用此函数。一旦停止录制,您将不得不重新配置它,就像它刚刚构建一样。请注意,运行时异常是
如果调用stop()时未收到有效的音频/视频数据,则故意将其抛出到应用程序。如果在start()之后立即调用stop(),则会发生这种情况。该故障使应用程序可以相应地采取措施清理输出文件(例如,删除输出文件),因为发生这种情况时输出文件的构造不正确
投掷
如果在start()之前调用,则为IllegalStateException
这就是文档所说的。记录器未初始化时会引发错误。尝试在数据源初始化完成后启动记录。
例如,如果您试图录制呼叫,请在摘机uccors时开始录制。您的应用程序是否具有写入外部存储的权限?是的,我已添加此权限,因此您的意思是我必须在调用服务的活动中引用异常并解决问题?我已经把它放到了其他应用程序中,并称之为后台服务,它可以工作。
RecordService.java
private MediaRecorder recorder;
private File instanceRecord;
private boolean recording= false;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onStart(Intent intent, int startId) {
startRecording();
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
stopRecording();
super.onDestroy();
}
private void prepareRecording()
{
try
{
recorder.prepare();
}
catch(IllegalStateException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void startRecording(){
try {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
Date today = Calendar.getInstance().getTime();
Format formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String reportDate = formatter.format(today);
File instanceRecordDirectory = new File(Environment.getExternalStorageDirectory() + File.separator + "TVB_PV_recordings");
if(!instanceRecordDirectory.exists()){
instanceRecordDirectory.mkdirs();
}
instanceRecord = new File(instanceRecordDirectory.getAbsolutePath() + File.separator + reportDate + "_sales_recording.mp4");
if(!instanceRecord.exists()){
instanceRecord.createNewFile();
}
recorder.setOutputFile(instanceRecord.getAbsolutePath());
prepareRecording();
recorder.start();
recording = true;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
public void stopRecording() {
if (recorder != null) {
try {
recorder.stop();
} catch(RuntimeException e) {
instanceRecord.delete(); //you must delete the outputfile when the recorder stop failed.
} finally {
recorder.release();
recorder = null;
}
}
}
Other Activity:
stopService(new Intent(EOrderSystemSubmit.this, RecordService.class));