今天先实现一个简单的音乐播放功能,包括播放/暂停切换和音乐切换播放功能。
布局修改
修改页面代码 增加正在播放的歌曲展示以及上一首、下一首、播放/暂停按钮布局。
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">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/ll_music_info" />
<LinearLayout
android:id="@+id/ll_music_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/ll_buttons"
android:padding="10dp">
<TextView
android:id="@+id/tv_current_music_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择播放歌曲" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center">
<ImageButton
android:id="@+id/ib_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_media_previous" />
<ImageButton
android:id="@+id/ib_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_media_play"
android:text="Play" />
<ImageButton
android:id="@+id/ib_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_media_next"
android:text="Next" />
</LinearLayout>
</RelativeLayout>
MediaPlayer播放音频学习
实现音乐播放和暂停
思路:我们给播放按钮添加点击事件,点击切换播放和暂停。暂停时,用 pausePosition 记录歌曲暂停的位置,再次点击播放按钮使用 seekTo 方法继续从这个位置继续播放。
使用 MediaPlayer 来播放歌曲列表中索引为 currentMusicIndex 的歌曲,默认是 0,所以默认播放了列表中第一首歌。
实现效果:
package com.example.musicapplication;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
......
private MediaPlayer mediaPlayer;
private TextView tvCurrentMusicTitle;
private ImageButton ibPlay;//播放/暂停按钮
private int currentMusicIndex;//当前播放歌曲索引
private int pausePosition;//歌曲暂停时间
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
//获取数据
getData();
//添加点击事件
initListener();
}
private void initView() {
......
mediaPlayer = new MediaPlayer();
tvCurrentMusicTitle = findViewById(R.id.tv_current_music_title);
ibPlay = findViewById(R.id.ib_play);
}
private void initListener() {
InnerClassOnClickListener listener = new InnerClassOnClickListener();
ibPlay.setOnClickListener(listener);
}
private void getData() {
......
}
//按钮监听
private class InnerClassOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.ib_play:
if (mediaPlayer.isPlaying()) {
pause();
} else {
play();
}
break;
}
}
}
//播放
private void play() {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(musics.get(currentMusicIndex).getPath());
mediaPlayer.prepare();
mediaPlayer.seekTo(pausePosition);
mediaPlayer.start();
ibPlay.setImageResource(android.R.drawable.ic_media_pause);
tvCurrentMusicTitle.setText("当前歌曲:" + musics.get(currentMusicIndex).getTitle());
} catch (IOException e) {
e.printStackTrace();
}
}
//暂停
private void pause() {
pausePosition = mediaPlayer.getCurrentPosition();
mediaPlayer.pause();
ibPlay.setImageResource(android.R.drawable.ic_media_play);
}
}
增加歌曲切换功能
**思路:**给上一首、下一首按钮添加点击事件。点击上一首让记录歌曲索引的 currentMusicIndex–,当小于 0 时,变为倒数第一首;点击下一首让记录歌曲索引的 currentMusicIndex++,当大于歌曲数量时,改为第一首。同时,需要清空记录暂停时间的 pausePosition,然后播放歌曲。
实现效果:
MainActivity
package com.example.musicapplication;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
......
private ImageButton ibPlay;//播放/暂停按钮
private ImageButton ibPrevious;//上一首按钮
private ImageButton ibNext;//下一首按钮
......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......
}
private void initView() {
......
ibPrevious = findViewById(R.id.ib_previous);
ibNext = findViewById(R.id.ib_next);
}
private void initListener() {
......
ibPrevious.setOnClickListener(listener);
ibNext.setOnClickListener(listener);
}
private void getData() {
......
}
//按钮监听
private class InnerClassOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
......
case R.id.ib_previous:
previous();
break;
case R.id.ib_next:
next();
break;
}
}
}
......
//下一首
private void next() {
currentMusicIndex++;
if (currentMusicIndex > musics.size() - 1) {
currentMusicIndex = 0;
}
//清空暂停时间
pausePosition = 0;
play();
}
//下一首
private void previous() {
currentMusicIndex--;
if (currentMusicIndex < 0) {
currentMusicIndex = musics.size() - 1;
}
//清空暂停时间
pausePosition = 0;
play();
}
}
选择列表歌曲播放功能
思路: 给 ListView 添加点击事件,改变记录歌曲索引的 currentMusicIndex 的值,然后播放歌曲即可。
实现效果:
MainActivity
public class MainActivity extends AppCompatActivity {
......
private void initListener() {
......
//为listview添加点击事件
OnItemClickListener onItemClickListener = new OnItemClickListener();
listView.setOnItemClickListener(onItemClickListener);
}
private void getData() {
......
}
//按钮监听
private class InnerClassOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
......
}
}
}
//ListView点击事件
private class OnItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
play(i);
}
}
//播放
private void play() {
......
}
//方法重载
private void play(int position){
currentMusicIndex = position;
pausePosition = 0;
play();
}
......
}