Android的停止录制失败 [英] Android stop recording fail

查看:552
本文介绍了Android的停止录制失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要启动服务开始录音。当我试图阻止,它显示了以下消息

  06-27 17:21:30.138:E / MediaRecorder(6122)时,停止所谓的无效状态:0

我不知道其他的功能,例如上传数据到服务器是否会影响结果(Asyck任务不落实,不仅调用方法)

如果我不明白的运行时异常,有时也可能显示的异常处理(整理活动,停止录音)

  06-27 17:32:35.988:W / System.err的(6818):java.lang.IllegalStateException
06-27 17:32:35.988:W / System.err的(6818):在android.media.MediaRecorder.stop(本机方法)
06-27 17:32:35.988:W / System.err的(6818):在tvbpv.test.EOrderSystem1.RecordService.sto precording(RecordService.java:109)
06-27 17:32:35.988:W / System.err的(6818):在tvbpv.test.EOrderSystem1.RecordService.onDestroy(RecordService.java:46)
06-27 17:32:35.988:W / System.err的(6818):在android.app.ActivityThread.handleStopService(ActivityThread.java:2401)
06-27 17:32:35.988:W / System.err的(6818):在android.app.ActivityThread.access $ 2000(ActivityThread.java:127)
06-27 17:32:35.988:W / System.err的(6818):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1225)
06-27 17:32:35.988:W / System.err的(6818):在android.os.Handler.dispatchMessage(Handler.java:99)
06-27 17:32:35.988:W / System.err的(6818):在android.os.Looper.loop(Looper.java:137)
06-27 17:32:35.988:W / System.err的(6818):在android.app.ActivityThread.main(ActivityThread.java:4519)
06-27 17:32:35.988:W / System.err的(6818):在java.lang.reflect.Method.invokeNative(本机方法)
06-27 17:32:35.988:W / System.err的(6818):在java.lang.reflect.Method.invoke(Method.java:511)
06-27 17:32:35.988:W / System.err的(6818):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:794)
06-27 17:32:35.988:W / System.err的(6818):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
06-27 17:32:35.988:W / System.err的(6818):在dalvik.system.NativeStart.main(本机方法)

开始录制

 九月六日至28日:14:47.646:E / MediaRecorder(3089):启动失败:-38
9月6日至28日:14:47.646:W / System.err的(3089):java.lang.IllegalStateException
9月6日至28日:14:47.646:W / System.err的(3089):在android.media.MediaRecorder.start(本机方法)
9月6日至28日:14:47.646:W / System.err的(3089):在tvbpv.test.EOrderSystem1.RecordService.startRecording(RecordService.java:87)
9月6日至28日:14:47.646:W / System.err的(3089):在tvbpv.test.EOrderSystem1.RecordService.onStart(RecordService.java:49)
9月6日至28日:14:47.646:W / System.err的(3089):在android.app.Service.onStartCommand(Service.java:438)
9月6日至28日:14:47.646:W / System.err的(3089):在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2371)
9月6日至28日:14:47.646:W / System.err的(3089):在android.app.ActivityThread.access $ 1900年(ActivityThread.java:127)
9月6日至28日:14:47.646:W / System.err的(3089):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1222)
9月6日至28日:14:47.646:W / System.err的(3089):在android.os.Handler.dispatchMessage(Handler.java:99)
9月6日至28日:14:47.646:W / System.err的(3089):在android.os.Looper.loop(Looper.java:137)
9月6日至28日:14:47.646:W / System.err的(3089):在android.app.ActivityThread.main(ActivityThread.java:4519)
9月6日至28日:14:47.646:W / System.err的(3089):在java.lang.reflect.Method.invokeNative(本机方法)
9月6日至28日:14:47.646:W / System.err的(3089):在java.lang.reflect.Method.invoke(Method.java:511)
9月6日至28日:14:47.646:W / System.err的(3089):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:794)
9月6日至28日:14:47.646:W / System.err的(3089):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
9月6日至28日:14:47.646:W / System.err的(3089):在dalvik.system.NativeStart.main(本机方法)

以下是我的code

  RecordService.java
私人MediaRecorder记录;
私人文件instanceRecord;
私人布尔记录= FALSE;
@覆盖
公众的IBinder onBind(意向为arg0){
    // TODO自动生成方法存根
    返回null;
}@覆盖
公共无效调用onStart(意向意图,诠释startId){
    的StartRecording();
    super.onStart(意向,startId);
}@覆盖
公共无效的onDestroy(){
    STO precording();
    super.onDestroy();
}私人无效prepareRecording()
{
    尝试
    {
        。录音机prepare();
    }
    赶上(IllegalStateException异常E)
    {
        e.printStackTrace();    }
    赶上(IOException异常E)
    {
        e.printStackTrace();
    }
}公共无效的startRecording(){    尝试{    记录=新MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEn codeR(MediaRecorder.AudioEn coder.DEFAULT);    今天的日期= Calendar.getInstance()的getTime()。
    格式格式化=新的SimpleDateFormat(YYYY-MM-dd_HH:MM:SS);
    字符串reportDate = formatter.format(今天);
    文件instanceRecordDirectory =新的文件(Environment.getExternalStorageDirectory()+文件分割符+TVB_PV_recordings);    如果(!instanceRecordDirectory.exists()){
        instanceRecordDirectory.mkdirs();
    }    instanceRecord =新的文件(instanceRecordDirectory.getAbsolutePath()+文件分割符+ reportDate +_sales_recording.mp4);
    如果(!instanceRecord.exists()){
        instanceRecord.createNewFile();
    }    recorder.setOutputFile(instanceRecord.getAbsolutePath());
    prepareRecording();
    recorder.start();
    记录= TRUE;    }赶上(IllegalStateException异常五){
        e.printStackTrace();
    }赶上(IOException异常五){
        e.printStackTrace();
    }赶上(例外五){
        e.printStackTrace();
    }
}公共无效STO precording(){
    如果(录像机!= NULL){
          尝试{
            recorder.stop();
          }赶上(RuntimeException的E){
              instanceRecord.delete(); //你必须删除OUTPUTFILE当录音机停止失败。
          } {最后
            recorder.release();
            记录= NULL;
          }
    }
}
其他活动:        stopService(新意图(EOrderSystemSubmit.this,RecordService.class));


解决方案

HTTP: //developer.android.com/reference/android/media/MediaRecorder.html - 看看图在主题的beginnig非常attantively。我肯定,您所呼叫站当记录没有启动。

停止录制。启动后调用此()。一旦录制停止,你会仿佛它刚刚建成再次对其进行配置。需要注意的是一个RuntimeException是
故意抛出应用程序,如果在停止()被调用已没有收到有效的音频/视频数据。这种情况如果停止()被调用后,立即启动()。未能相应地让应用程序采取行动,清理输出文件(删除输出文件,例如),因为输出文件未正确构造时发生这种情况。

 抛出
IllegalStateException异常如果开始前称为()

这是什么文件说。

I am going to start a service to start audio recording. When I am trying to stop , it shows the following message

06-27 17:21:30.138: E/MediaRecorder(6122): stop called in an invalid state: 0

I am not sure whether other functions such Uploading data to server can affect the result ( not implemented in Asyck Task , only calling methods )

If I do not catch the runtime exception, sometimes it may shows the handler exception (Finishing Activity , stop recording )

06-27 17:32:35.988: W/System.err(6818): java.lang.IllegalStateException
06-27 17:32:35.988: W/System.err(6818):     at android.media.MediaRecorder.stop(Native Method)
06-27 17:32:35.988: W/System.err(6818):     at tvbpv.test.EOrderSystem1.RecordService.stopRecording(RecordService.java:109)
06-27 17:32:35.988: W/System.err(6818):     at tvbpv.test.EOrderSystem1.RecordService.onDestroy(RecordService.java:46)
06-27 17:32:35.988: W/System.err(6818):     at android.app.ActivityThread.handleStopService(ActivityThread.java:2401)
06-27 17:32:35.988: W/System.err(6818):     at android.app.ActivityThread.access$2000(ActivityThread.java:127)
06-27 17:32:35.988: W/System.err(6818):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1225)
06-27 17:32:35.988: W/System.err(6818):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-27 17:32:35.988: W/System.err(6818):     at android.os.Looper.loop(Looper.java:137)
06-27 17:32:35.988: W/System.err(6818):     at android.app.ActivityThread.main(ActivityThread.java:4519)
06-27 17:32:35.988: W/System.err(6818):     at java.lang.reflect.Method.invokeNative(Native Method)
06-27 17:32:35.988: W/System.err(6818):     at java.lang.reflect.Method.invoke(Method.java:511)
06-27 17:32:35.988: W/System.err(6818):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
06-27 17:32:35.988: W/System.err(6818):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
06-27 17:32:35.988: W/System.err(6818):     at dalvik.system.NativeStart.main(Native Method)

Start recording

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)

The below is my code

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

解决方案

http://developer.android.com/reference/android/media/MediaRecorder.html - look the diagram at the beginnig of the topic very attantively. I am sure, you are calling stop when the recording wasn't started.

Stops recording. Call this after start(). Once recording is stopped, you will have to configure it again as if it has just been constructed. Note that a RuntimeException is intentionally thrown to the application, if no valid audio/video data has been received when stop() is called. This happens if stop() is called immediately after start(). The failure lets the application take action accordingly to clean up the output file (delete the output file, for instance), since the output file is not properly constructed when this happens.

Throws
IllegalStateException   if it is called before start()

This what the documentation says.

这篇关于Android的停止录制失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆