【问题标题】:Android stop recording failAndroid停止录制失败
【发布时间】:2013-06-24 17:40:18
【问题描述】:

我要启动一个服务来开始录音。当我试图停止时,它会显示以下消息

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

不知道上传数据到服务器等其他功能是否会影响结果(Asyck Task中没有实现,只调用方法)

如果我没有捕捉到运行时异常,有时可能会显示处理程序异常(Finishing Activity,停止录制)

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)

开始录制

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

【问题讨论】:

  • 您的应用是否有权写入外部存储?
  • 是的,我已经添加了这个权限

标签: android audio recording


【解决方案1】:

http://developer.android.com/reference/android/media/MediaRecorder.html - 非常专心地看主题开头的图表。我敢肯定,当录制没有开始时,您正在调用 stop。

停止录制。在 start() 之后调用它。停止录制后,您必须重新配置它,就像它刚刚构建一样。请注意,RuntimeException 是 如果在调用 stop() 时未收到有效的音频/视频数据,则故意将其扔给应用程序。如果在 start() 之后立即调用 stop(),就会发生这种情况。失败让应用程序采取相应的行动来清理输出文件(例如删除输出文件),因为发生这种情况时输出文件的构造不正确。

投掷 IllegalStateException 如果在 start() 之前被调用

这就是文档所说的。

【讨论】:

  • 那么你的意思是我必须参考异常并在调用服务的活动中解决问题吗?我已经把它放到其他应用程序中并且只调用这个后台服务,它可以工作。
【解决方案2】:

记录器未初始化时抛出错误。数据源初始化完成后尝试开始记录。 例如,如果您正在尝试录制通话,请在摘机时开始录制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2017-03-29
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多