私は非常に単純な使命を持つ次のプログラムを作成しました: オーディオを録音してから表示します。記録されたサンプルをグラフィカルに表示できる別の方法を追加しようとしていました。そのために、@Robby Pond が 1 年前にこの他の質問で行った提案を使用しました。
http://stackoverflow.com/questions/5333908/fileinputstream-to-byte-array-in-android-application
私の活動の核心は次のようになります。
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class RecorderTutorial extends Activity implements OnClickListener{
MediaRecorder mRecorder = new MediaRecorder();
MediaPlayer mPlayer = new MediaPlayer();
boolean isRecording = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recorder_tutorial);
findViewById(R.id.play_back_button).setOnClickListener(this);
findViewById(R.id.record_button).setOnClickListener(this);
findViewById(R.id.draw).setOnClickListener(this);
}
public void onClick(View v) {
mPlayer.stop();
switch (v.getId()) {
case R.id.play_back_button:
if (!isRecording && !mPlayer.isPlaying()) {
try {
mPlayer.reset();
mPlayer.setDataSource("/sdcard/audio_demo.3gp");
mPlayer.prepare();
mPlayer.start();
} catch (Exception e) {
Toast.makeText(this, "Error playing back audio.",Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.record_button:
if (isRecording) {
isRecording = false;
((Button)(findViewById(R.id.record_button))).setText("record");
mRecorder.reset();
} else {
try {
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/sdcard/audio_demo.3gp");
mRecorder.prepare();
mRecorder.start();
((Button)(findViewById(R.id.record_button))).setText("stop");
isRecording = true;
} catch (Exception e) {
Toast.makeText(this, "Error starting recorder.",Toast.LENGTH_SHORT).show();
}
}
break;
case R.id.draw:
final Context context = v.getContext();
int bytesRead;
try {
InputStream is = context.openFileInput("/sdcard/audio_demo.3gp");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = is.read(b)) != -1) {
bos.write(b, 0, bytesRead);
}
byte[] bytes = bos.toByteArray();
System.out.println(" One random values is: "+bytes[5]+" \n");
}catch(Exception e) {
Toast.makeText(this, "Error starting draw. ",Toast.LENGTH_SHORT).show();
}
break;
}
}
@Override
public void onDestroy() {
if (isRecording) {
Toast.makeText(this, "Recorder stopped.",Toast.LENGTH_SHORT).show();
mRecorder.stop();
}
mRecorder.release();
mPlayer.stop();
mPlayer.release();
super.onDestroy();
}
}
コードのその部分を実行すると、3番目のオプション -R.id.draw case- が試行で壊れる理由を誰か教えてもらえますか? ファイルを開く方法が間違っていますか?
ご助力ありがとうございます!