随着移动端技术的飞速发展,现如今手机的功能愈发强大,播放音频已经是作为一部手机最基本的功能之一了。相信大家手机中都有安装音乐播放器,比如:QQ音乐、酷狗、“网抑云音乐”等。这些播放功能都很强大,界面都很美观。但是毕竟众口难调,Android给播放音频和视频都提供了一套比较完整的API,我们就可以利用其来定制一个自己音频播放器。
在Android中播放音频文件一般是使用MediaPlayer类实现的,它对多种格式的音频提供了非常全面的控制方法,使得播放音乐的工作变得十分简单。以下就是MediaPlayer类中的一些常用的方法:
- setDateSource:设置要播放的音频文件的位置
- prepare:在开始播放前调用,以完成准备工作
- start:开始或者继续播放音频
- pause:暂停播放音频
- reset:将MediaPlayer对象重置到刚创建的状态
- seekTo:从指定的位置开始播放音频
- stop:停止播放音频,调用后的MediaPlayer对象无法在播放音频
- release:释放与MediaPlayer对象相关的资源
- isPlaying:判断当前MediaPlayer是否正在播放音频
- getDuration:获取载入的音频文件的时长
对上述方法做了简单了解后,我们来梳理一下MediaPlayer的工作流程,首先,我们需要新建一个MediaPlayer对象,然后调用setDataSource( )方法设置音频文件的路径,然后再调用prepare( )方法使MediaPlayer进入准备状态,再调用start( )方法就可以开始播放音频,pause( )方法暂停播放,调用reset( )方法停止播放。以上就实现一个音频播放器最基础的开始播放、暂停播放、结束播放三个功能。
下面我们将通过一个实例来学习如何实现一个简易的音频播放器,新建一个MusicPlayer项目。然后修改布局代码,如下:
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="MultiMedia.MultiMediaActivity"> <TextView android:layout_marginTop="50dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Music Player" android:textColor="#EE1111" android:textSize="40sp" app:layout_constraintTop_toTopOf="parent"/> <Button android:id="@+id/btn_Play" android:layout_marginTop="150dp" android:layout_marginLeft="70dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableLeft="@mipmap/play" android:background="#FAFAFA" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"/> <Button android:id="@+id/btn_Pause" android:layout_marginTop="150dp" android:layout_marginLeft="20dp" android:drawableLeft="@mipmap/pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FAFAFA" app:layout_goneMarginTop="150dp" app:layout_constraintLeft_toRightOf="@id/btn_Play" app:layout_constraintTop_toTopOf="parent"/> <Button android:id="@+id/btn_Stop" android:drawableLeft="@mipmap/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FAFAFA" android:layout_marginLeft="20dp" android:layout_marginTop="150dp" app:layout_constraintLeft_toRightOf="@id/btn_Pause" app:layout_constraintTop_toTopOf="parent"/> androidx.constraintlayout.widget.ConstraintLayout>
界面如下:
可以看到布局中添加了一个TextView和三个Button,分别用于对音频文件进行播放、暂停和停止操作。 MediaPlayer可以用于播放网络上、本地及应用程序安装包中的音频,这里我们主要是来学习如何使用MediaPlayer,所以我们就来播放应用程序安装包内的音频文件。Android Studio允许我们在项目工程中创建一个assets目录,在该目录下可以存放任意文件和子目录,在应用安装时,这些目录和文件会一并被加载到手机上,然后我们可以在程序中借助AssetManager类提供的接口获取放在assets目录下的文件。 首先我们先来创建一个assets目录,值得注意的是该目录必须创建在app/src/main目录下,与java、res目录是同级关系,右击app/src/main--New--Directory,在弹出的对话框中输入"assets",即可创建。接着我们把需要播放的音频文件"music.mp3"放到该目录下。 然后修改java文件中的代码:
public class MultiMediaActivity extends AppCompatActivity { private MediaPlayer mediaPlayer = new MediaPlayer(); private Button mBtnPlay, mBtnPause, mBtnStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_multi_media); try { initMediaPlayer(); } catch (IOException e) { e.printStackTrace(); } mBtnPlay = findViewById(R.id.btn_Play); mBtnPause = findViewById(R.id.btn_Pause); mBtnStop = findViewById(R.id.btn_Stop); setListeners(); } private void setListeners() { OnClick onClick = new OnClick(); mBtnPlay.setOnClickListener(onClick); mBtnPause.setOnClickListener(onClick); mBtnStop.setOnClickListener(onClick); } private class OnClick implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_Play: if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); Toast.makeText(MultiMediaActivity.this, "开始为您播放音乐", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_Pause: if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); Toast.makeText(MultiMediaActivity.this, "已为您暂停播放当前音乐", Toast.LENGTH_SHORT).show(); } else { mediaPlayer.start(); Toast.makeText(MultiMediaActivity.this, "继续为您播放音乐", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_Stop: if (mediaPlayer.isPlaying()) { mediaPlayer.reset(); Toast.makeText(MultiMediaActivity.this, "已停止播放当前音乐", Toast.LENGTH_SHORT).show(); try { initMediaPlayer(); } catch (IOException e) { e.printStackTrace(); } break; } } } } public void initMediaPlayer() throws IOException { AssetManager manager = getAssets(); AssetFileDescriptor assetFileDescriptor = manager.openFd("music.mp3"); mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); mediaPlayer.prepare(); } @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.stop(); mediaPlayer.release(); }}