オーディオを録音するためのサンプルプログラムを作成しています。録音を開始および停止するためのボタンがあります。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
音声は完全に録音されています。問題は音声とスレッドを停止することだと思います。どこで修正するのかわかりません。事前に助けてくれてありがとう。