Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法停止音频录制,线程工作不正常,应用程序不幸停止_Android_Multithreading_Audio - Fatal编程技术网

Android 无法停止音频录制,线程工作不正常,应用程序不幸停止

Android 无法停止音频录制,线程工作不正常,应用程序不幸停止,android,multithreading,audio,Android,Multithreading,Audio,我正在制作一个用于录制音频的示例程序。我有一个用于开始和停止录制的按钮。我正在运行一个线程,以便可以录制到30秒。我的问题是,在达到30秒之前,如果我单击stopButton,我的应用程序将不幸停止。现在我没有遇到问题。 以下是我的代码: public class AudioRecordingActivity extends Activity { private Button RecordButton; boolean recording; MediaRecorder recorder ; Th

我正在制作一个用于录制音频的示例程序。我有一个用于开始和停止录制的按钮。我正在运行一个线程,以便可以录制到30秒。我的问题是,在达到30秒之前,如果我单击stopButton,我的应用程序将不幸停止。现在我没有遇到问题。 以下是我的代码:

public class AudioRecordingActivity extends Activity {
private Button RecordButton;
boolean recording;
MediaRecorder recorder ;
Thread RecordThread;
Handler recordHandler;
private TextView timeText;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    timeText=(TextView)findViewById(R.id.textView1);

    RecordButton=(Button)findViewById(R.id.btnRecord);
    RecordButton.setText("Start Recording");
    RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 
    recording=false;
    RecordButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (recording)
            {

                 recording=false;

                stopRecording();
                RecordButton.setText("Start Recording");
                RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 
             // Toast.makeText(getApplicationContext(), "Recording Stopped", Toast.LENGTH_LONG).show();



            }//if(recording)
            else if(!recording) {

                recording=true;
                startRecording();
                RecordButton.setText("Stop Recording");
                RecordButton.getBackground().setColorFilter(new LightingColorFilter(-65536, 0));
            //    Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();

                recordHandler = new Handler();
                  RecordThread=new Thread(new Runnable() {
                      int j;
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub

                        for( j=30;j>=0;j--){
                            if(recording){
                                recordHandler.post(new Runnable() {

                                    @Override
                                    public void run() {
                                        // TODO Auto-generated method stub
                                    setTimer(j);
                                    }//handler run

                                });//post
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }//catch
                            }else if (!recording)
                            {
                                stopRecording();

                            }
                        }//for
                    }//run  

                });
                RecordThread.start();


            }


        }
    });


}//onCreate
protected void startRecording() {
    // TODO Auto-generated method stub

    Random generator = new Random();
    int n = 1000;
    n = generator.nextInt(n);
     File folder = new File(Environment.getExternalStorageDirectory().toString()+"/AudioRecord");
      if(!folder.exists())
        {
          folder.mkdirs();

        } 
       String path = Environment.getExternalStorageDirectory().getAbsolutePath() +
            "/AudioRecord/audiorecord"+n+".3gp";                  



    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile(path);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

     Toast.makeText(getApplicationContext(),"Saving Audio as"+ path,
            Toast.LENGTH_LONG).show();
      try {
        recorder.prepare();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        Toast.makeText(getApplicationContext(), "IllegalStateException called", Toast.LENGTH_LONG).show();


    } catch (IOException e) {
        // TODO Auto-generated catch block
        Toast.makeText(getApplicationContext(), "prepare() failed", Toast.LENGTH_LONG).show();

    }

      recorder.start();


}

 private void stopRecording() {

     recorder.stop();
     recorder.release();
     recorder = null;


    }

    private void setTimer(int j) {
        // TODO Auto-generated method stub
         ((TextView)findViewById(R.id.textView1)).setText(String.valueOf(j) + "sec");
        if(j==0){
            recording=false;

        }


    }
}//class end
音频被完美录制。我想问题在于停止音频和线程。我不知道在哪里进行更正。
提前感谢您的帮助。

问题已解决:已进行以下更正

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (recording)
            {
                if(recorder!=null){
                     recorder.stop();
                     recorder.release();
                     recorder = null;
                }

                recording=false;
                RecordButton.setText("Start Recording");
                RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 
             // Toast.makeText(getApplicationContext(), "Recording Stopped", Toast.LENGTH_LONG).show();



            }


你能发布一个错误日志吗?我在电话上遇到了错误。不幸的是,当我点击停止按钮时,我的应用程序停止了。如果你能在问题发生时从电话上发布日志,那将非常有帮助。为此,请打开终端窗口并键入“adb logcat”。重现问题并从窗口复制粘贴文本。hey获得d更正..进行了以下更改..thnks。。
private void setTimer(int j) {
        // TODO Auto-generated method stub
         timeText.setText(String.valueOf(j) + "sec"); 
         if ((recording) && (j==1)){

                recorder.stop();
                recorder.release();
                recorder = null;
                recording=false;
                RecordButton.setText("Start Recording");
                RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 

            }





    }