MediaPlayer
突然觉得这个音乐播放有点意思,我们来做一下吧。
首先我们来一个名为MediaPlayerDemo的项目。
然后再main.xml文件里面创建三个按钮,分别是播放、暂停、停止,代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/play" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Play"/> <Button android:id="@+id/pause" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Pause"/> <Button android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Stop"/> </LinearLayout>
然后我们进入MainActivity活动页面,代码如下:
package com.example.mediaplayerdemo; import android.Manifest; import android.content.pm.PackageManager; import android.media.MediaPlayer; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File; //继承View.OnClickListener,是按钮放在一起更直观,用另一种方法来设置按钮点击监听 public class MainActivity extends AppCompatActivity implements View.OnClickListener { //定义三个按钮并实例化MediaPlayer private MediaPlayer mediaPlayer = new MediaPlayer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button play = (Button)findViewById(R.id.play); Button pause = (Button)findViewById(R.id.pause); Button stop = (Button)findViewById(R.id.stop); play.setOnClickListener(this); pause.setOnClickListener(this); stop.setOnClickListener(this); if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE},1); }else { initMediaPlayer();//初始化MediaPlayer } } /* * 初始化MediaPlayer * */ private void initMediaPlayer(){ try { File file = new File(Environment.getExternalStorageDirectory(),"music.mp3"); mediaPlayer.setDataSource(file.getPath());//指定音频文件的路径 mediaPlayer.prepare();//让MediaPlayer进入到准备状态 }catch (Exception e){ e.printStackTrace(); } } public void onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){ switch (requestCode){ case 1: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ initMediaPlayer(); }else { Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show(); finish(); } break; default: } } @Override public void onClick(View v){ switch (v.getId()){ case R.id.play: if(!mediaPlayer.isPlaying()){ mediaPlayer.start();//开始播放 } break; case R.id.pause: if(mediaPlayer.isPlaying()){ mediaPlayer.pause();//暂停播放 } break; case R.id.stop: if(mediaPlayer.isPlaying()){ mediaPlayer.reset();//停止播放 initMediaPlayer(); } break; default: break; } } @Override protected void onDestroy(){ super.onDestroy(); if(mediaPlayer != null){ mediaPlayer.stop(); mediaPlayer.release(); } } }
接下来我么来解释一下这一段代码,看上去还是挺多的。
在类初始化的时候就创建了一个MediaPlayer的实例,然后在onCreate()方法中进行了运行时权限处理,动态申请WRITE_EXTERNAL_STORAGE权限,因为我们的音乐文件是放在手机SD卡里面,所以需要这个权限来访问SD卡。在AndroidManifest.xml中添加这个权限
在onRequestPermissionResult()(你可以把这个方法理解为请求权限结果)方法中,如果你拒绝了这个权限申请,那么就会调用finish方法将程序直接关掉。
用户同意授权之后就会调用initMediaPlayer()方法为MediaPlayer对象进行初始化操作,在initMediaPlayer()方法中,首先是通过创建一个File(文件)对象来指定音频文件的路径,所以我们需要在SD卡的根目录下面放置一个名为music.mp3的音频文件。后面调用setDataSource()和prepare()方法为MediaPlayer做好播放准备。
下面的点击事件中我们对每个按钮进行判断,当点击Play按钮时会进行判断,如果当前MediaPlayer没有正在播放的音频就调用start()方法开始播放。当点击Pause按钮时会进行判断,如果当前MediaPlayer正在播放音频就调用pause()方法暂停播放。当点击Stop按钮时会进行判断,如果当前MediaPlayer正在播放音频就调用reset()方法将MediaPlayer重置为刚刚创建时的状态,然后重新调用一遍initMediaPlayer()方法。
最后在onDestroy()方法中,我们分别调用stop()方法和release()方法,将MediaPlayer相关的资源释放掉。