Android视频录制-mediaRecorder.start上的非法状态异常

Android视频录制-mediaRecorder.start上的非法状态异常,android,android-camera,android-mediarecorder,Android,Android Camera,Android Mediarecorder,我正在学习有关的教程 因此,我在尝试启动相机时遵循以下顺序: 照相机,打开 照相机。解锁 mediaRecorder.setCamera mediaRecorder.setAudioSource mediaRecorder.setVideoSource mediaRecorder.setProfile mediaRecorder.setOutputFile 准备 mediaRecorder.start再次比较我的代码,您似乎错过了两个调用: mediaRecorder.setVideoSize(

我正在学习有关的教程

因此,我在尝试启动相机时遵循以下顺序:

  • 照相机,打开
  • 照相机。解锁
  • mediaRecorder.setCamera
  • mediaRecorder.setAudioSource
  • mediaRecorder.setVideoSource
  • mediaRecorder.setProfile
  • mediaRecorder.setOutputFile
  • 准备

  • mediaRecorder.start再次比较我的代码,您似乎错过了两个调用:

    mediaRecorder.setVideoSize(int width, int height)
    mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)
    
    后者最有可能导致崩溃,因为Android需要有效的预览界面才能开始录制。这样做是为了防止隐藏摄像头应用程序

    在没有预览界面的情况下,有几十个与录制相关的问题,但这似乎总结了您需要做些什么来绕过此限制。
    基本思想是将曲面的大小调整为1x1,并将其传递给
    mediaRecorder
    实例。请记住,这可能并不适用于所有设备。

    如果您多次访问麦克风硬件,例如,一次使用MediaRecorder和AudioRecord类,也会例外。

    我只是看了一下我的代码,配置了比您更多的东西。但是我认为主要的区别是
    mediaRecorder.setVideoSize(int-width,int-height)
    mediaRecorder.setPreviewDisplay(SurfaceHolder-surfacehold)
    。也许设置其中一个可以帮助它工作。顺便说一句,你能粘贴你的堆栈跟踪吗?@EdsonMenegati谢谢你的回复。。。我没有使用预览窗口,所以我认为我不需要这些调用,但我会尝试添加setVideoSize,看看这是否会让事情变得明朗。我将在今天晚些时候发布完整的堆栈跟踪,这是否意味着您根本没有显示任何相机预览?@EdsonMenegati这是正确的。出于我的目的,我想录制视频,但不显示预览窗口。我现在正在做的基本工作就是启动/停止录制按钮,并将视频文件保存在某个地方。。。还是很惊讶它证明了这很麻烦!不幸的是,你不能这样做。在安卓系统中,如果您想录制,则必须显示相机预览。它以这种方式实现,以防止隐藏的摄像头应用程序。SO中有很多相关的问题,但是看看这个链接谢谢@Edson原来我没有包括预览,这导致了失败。根据问题中链接的指南,我添加了预览类并附加了surfaceview,解决了我的问题。
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.microphone" />
    
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
    
    mediaRecorder.setVideoSize(int width, int height)
    mediaRecorder.setPreviewDisplay(SurfaceHolder surfaceHolder)