java.lang.IllegalStateException:适用于Android studio中的MediaRecorder

java.lang.IllegalStateException:适用于Android studio中的MediaRecorder,java,android,Java,Android,我在尝试从应用程序中单击录制按钮时遇到非法状态异常。到目前为止,我已经在三台android版本分别为7、9和10的设备上进行了测试。问题是,它在9和10的设备上工作正常,但在7中,一旦我达到记录甚至停止,它就会抛出“IllegalStateException”并导致应用程序崩溃。代码如下: public class VoiceRecorder extends Dialog implements VoiceRecorderInterface { private Button startbt

我在尝试从应用程序中单击录制按钮时遇到非法状态异常。到目前为止,我已经在三台android版本分别为7、9和10的设备上进行了测试。问题是,它在9和10的设备上工作正常,但在7中,一旦我达到记录甚至停止,它就会抛出“IllegalStateException”并导致应用程序崩溃。代码如下:

public class VoiceRecorder extends Dialog implements VoiceRecorderInterface {
    private Button startbtn,stopbtn;
//    private Button playbtn, stopplay;
    private MediaRecorder mRecorder;
    private MediaPlayer mPlayer;
    private static final String LOG_TAG = "AudioRecording";
    private static String mFileName = null;
    public static final int REQUEST_AUDIO_PERMISSION_CODE = 1;
    Context context;
    public   HashSet<String> paths =null;
    AppPreference  preference;

    public VoiceRecorder(@NonNull Context context) {
        super(context);
        this.context = context;
    }


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_voice_recorder);
        preference = new AppPreference(context);
        paths = new HashSet<>();
        startbtn = (Button) findViewById(R.id.btnRecord);
        stopbtn = (Button) findViewById(R.id.btnStop);     
        stopbtn.setEnabled(false);
        mFileName =context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)+"/Spares/";
        mFileName += "/"+preference.tripData().getTripId()+".3gp";

        startbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(CheckPermissions()) {
                    stopbtn.setEnabled(true);
                    startbtn.setEnabled(false)                 
                    mRecorder = new MediaRecorder();
                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    mRecorder.setOutputFile(mFileName);
                    try {
                        mRecorder.prepare();
                    } catch (IOException e) {
                        Log.e(LOG_TAG, "prepare() failed");
                    }
                    mRecorder.start();
                    Toast.makeText(context, "Recording Started", Toast.LENGTH_LONG).show();
                }
                else
                {
                    RequestPermissions();
                }
            }
        });
        stopbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopbtn.setEnabled(false);
                startbtn.setEnabled(true);
                mRecorder.stop();
                mRecorder.release();
                mRecorder = null;
                paths.add(mFileName);
                Databack activity = (Databack) context;
                activity.onReturnValue(mFileName);
                preference.setPaths(paths);
                Toast.makeText(context, "Recording Stopped", Toast.LENGTH_LONG).show();
            }
        });
//        
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_AUDIO_PERMISSION_CODE:
                if (grantResults.length> 0) {
                    boolean permissionToRecord = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean permissionToStore = grantResults[1] ==  PackageManager.PERMISSION_GRANTED;
                    if (permissionToRecord && permissionToStore) {
                        Toast.makeText(context, "Permission Granted", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(context,"Permission Denied",Toast.LENGTH_LONG).show();
                    }
                }
                break;
        }
    }
    public boolean CheckPermissions() {
        int result = ContextCompat.checkSelfPermission(context, WRITE_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(context, RECORD_AUDIO);
        return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
    }
    private void RequestPermissions() {
        ActivityCompat.requestPermissions((Activity) context, new String[]{RECORD_AUDIO, WRITE_EXTERNAL_STORAGE}, REQUEST_AUDIO_PERMISSION_CODE);
    }
}
如果我达到记录,我将在以下位置获得豁免:

mRecorder.start()

我们非常感谢您的帮助

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ceo.optionmatrix.com.xpdriver, PID: 19688
    java.lang.IllegalStateException
        at android.media.MediaRecorder.stop(Native Method)
        at ceo.optionmatrix.com.xpdriver.helper.VoiceRecorder$2.onClick(VoiceRecorder.java:100)
        at android.view.View.performClick(View.java:5619)
        at android.view.View$PerformClick.run(View.java:22298)
        at android.os.Handler.handleCallback(Handler.java:754)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)