前回はオーディオファイルの録音方法についてお話しました。今回はオーディオファイルの再生方法についてお話します。音声を録音します。通常、チャットで音声を送信したり、音声をアップロードしたりするときに使用します。録音が必要なため、再生機能が必要です。同時に、オーディオを再生し、音楽も再生する必要があります。そこで本日は、オーディオ再生機能についてお話します。
1.メディアプレーヤーの紹介MediaPlayer
オーディオを再生しているので、MediaPlayerが使用されます。MediaPlayerは、Androidに付属のオーディオおよびビデオプレーヤーです。これを使用して、MediaRecorderによって記録されたamr、aac、mp4、3gpなどのメディアファイルや、mp3、wav、mid、ogg、mkvなどのオーディオファイルを再生できます。 、mov、aviなど。ビデオファイル。
2. MediaPlayerの一般的な方法(ブロードキャストとプロジェクションに共通)
- リセット:プレーヤーをリセットします。
- 準備:プレイする準備ができました。
- 開始:再生を開始します
- 一時停止:再生を一時停止します。
- stop:再生を停止します。
- setOnPreparedListener:再生するリスナーを設定します。インターフェイスMediaPlayer.OnPreparedListenerのonPreparedメソッドを実装する必要があります。
- setOnCompletionListener:再生終了リスナーを設定します。インターフェイスMediaPlayer.OnCompletionListenerのonCompletionメソッドを実装する必要があります。
- setOnSeekCompleteListener:再生ドラッグリスナーを設定します。インターフェイスMediaPlayer.OnSeekCompleteListenerのonSeekCompleteメソッドを実装する必要があります。
- create:指定したUriでプレイヤーを作成します。
- setDataSource:再生データソースのファイルパスを設定します。createとsetDataSourceの2つのメソッドのうち1つだけを呼び出す必要があります。
- setVolume:音量を設定します。2つのパラメータは、左チャネルと右チャネルの音量で、値は0〜1です。
- setAudioStreamType:オーディオストリームのタイプを設定します。オーディオストリームタイプの値の説明については、表1を参照してください。
表1 | ||
AudioManagerクラスのリングタイプ |
着メロ名 | 説明 |
STREAM_VOICE_CALL | コールトーン | |
STREAM_SYSTEM | システムトーン | |
STREAM_RING | 着信音 | 着信やテキストメッセージの着信音 |
STREAM_MUSIC | メディアサウンド | オーディオ、ビデオ、ゲームなどのサウンド |
STREAM_ALARM | アラーム音 | |
STREAM_NOTIFICATION | 通知音 |
- setLooping:再生をループするかどうかを設定します。trueはループで再生することを意味し、falseは1回だけ再生することを意味します。
- isPlaying:再生しているかどうかを確認します。
- seekTo:再生の進行状況を指定した位置にドラッグします。このメソッドは、SeekBarドラッグバーと組み合わせて使用できます。
- getCurrentPosition:現在の再生進行状況の位置を取得します。
- getDuration:再生時間をミリ秒単位で取得します。
3.サンプルコード
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ProgressBar
android:id="@+id/pro_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/bt_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始" />
<Button
android:id="@+id/bt_pause"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停" />
</LinearLayout>
</RelativeLayout>
MainActivity.java
public class MainActivity extends WaterPermissionActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {
private String voicePath;
private ProgressBar pro_bar;
private Button bt_start;
private Button bt_pause;
private MediaPlayer mMediaPlayer;
private Handler mHandler;
private boolean isComplete = true;//是否完成
@Override
protected MvcBaseModel getModelImp() {
return null;
}
@Override
protected int getContentLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initWidget() {
pro_bar = findViewById(R.id.pro_bar);
bt_start = findViewById(R.id.bt_start);
bt_pause = findViewById(R.id.bt_pause);
bt_start.setOnClickListener(this);
bt_pause.setOnClickListener(this);
requestPermission(WRITE_EXTERNAL_STORAGE);
}
@Override
protected void doSDWrite() {
requestPermission(READ_EXTERNAL_STORAGE);
}
@Override
protected void doSDRead() {
//初始化音源路径
getPath();
//初始化媒体播放器
init();
}
/**
* 录制前创建一个空文件并获取路径
*/
private void getPath() {
List<String> list = new ArrayList<>();
list.add("record");
String dirPath = PathGetUtil.getLongwayPath(this, list);
File fileVoice = new File(dirPath, "voice1616667408548.amr");
voicePath = fileVoice.getPath();
}
/**
* 初始化MediaPlayer
*/
private void init() {
mHandler = new Handler();
mMediaPlayer = new MediaPlayer();//创建一个媒体播放器
mMediaPlayer.setOnCompletionListener(this);//设置媒体播放器的播放完成监听器
//定时器
mHandler.postDelayed(r, 100);//延时100毫秒
}
/**
* 播放音频
*/
private void play() {
try {
isComplete = false;
//重置媒体播放器
mMediaPlayer.reset();
//设置音频类型为音乐
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置媒体数据的文件路径
mMediaPlayer.setDataSource(voicePath);
//媒体播放器准备就绪
mMediaPlayer.prepare();
//媒体播放器开始播放
mMediaPlayer.start();
//设置进度条
pro_bar.setMax(mMediaPlayer.getDuration());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_start:
if (pro_bar.getProgress()!=0) {
//暂停开始
mMediaPlayer.start();
} else {
//普通开始
play();
}
break;
case R.id.bt_pause:
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
break;
}
}
@Override
public void onCompletion(MediaPlayer mp) {
isComplete = true;
ToastUtil.toastWord(this, "播放完成");
}
private Runnable r = new Runnable() {
@Override
public void run() {
if (mHandler != null) {
if (isComplete) {
pro_bar.setProgress(0);
} else {
pro_bar.setProgress(mMediaPlayer.getCurrentPosition());
}
mHandler.postDelayed(this, 500);
}
}
};
}