在安卓上播放多媒体文件是非常常见的,听音乐,看电视等等,接下来,我们就通过一些例子来学习在手机上播放一个简易的音频和视频播放器。
播放音频
别的不多说,直接上代码吧!
activity_main.xml代码
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放" />
<Button
android:id="@+id/pause"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停" />
<Button
android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停止" />
</LinearLayout>
布局文件中我们放了三个按钮,分别用于播放音频,暂停音频个停止音频。
MainActivity.java代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private MediaPlayer mp= new MediaPlayer();//MediaPlayer 实例
private Button play;
private Button pause;
private Button stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = findViewById(R.id.play);//播放按钮
pause = findViewById(R.id.pause);//暂停按钮
stop = 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();
}
}
//请求权限后的回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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:
}
}
private void initMediaPlayer(){
//创建一个File对象指定音频的文件路径
File file = new File(Environment.getExternalStorageDirectory(),"奇妙世界.mp3");
try {
mp.setDataSource(file.getPath());//指定音频文件的路径
mp.prepare();//让MediaPlayer进入到准备状态
} catch (IOException e) {
e.printStackTrace();
}
}
//按钮点击事件
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.play:
if(!mp.isPlaying()){
mp.start();//开始播放
}
break;
case R.id.pause:
if(mp.isPlaying()){
mp.pause();
}
break;
case R.id.stop:
if(mp.isPlaying()){
mp.reset();//停止播放
initMediaPlayer();
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//将资源释放掉
if(mp != null){
mp.stop();
mp.release();
}
}
}
我们先创建了一个MediaPlayer 实例和得到三个按钮控件的实例。然后在onCreate()里面动态申请WRITE_EXTERNAL_STORAGE这个权限(因为我们要访问手机上的SD卡),做个判断,如果没有这个权限就添加这个权限,如果有,就直接调用 initMediaPlayer()这个方法。
在onRequestPermissionsResult()方法中,如果用户拒绝了权限申请,那么就调用finish()方法将程序关掉,因为没有SD卡的权限,这个程序用不了。
用户同意了权限后就会调用initMediaPlayer()方法。我们先创建一个File对象来指定音频文件的路径,从这里可以看出,我们需要事先在SD卡的根目录下放入一个音频文件,名字可以自己定义。后面分别调用setDataSource()方法和prepare()方法,得到音频文件的路径和让MediaPlayer进入到准备状态。(这里注意一下,有些人会找不到SD卡的根目录在哪,因为我也遇到过这个问题~,你可以直接把音频放在打开内部存储的第一个页面中)。
接下来就是点击事件,当你点击播放按钮的时候,会判断这个音频是否在播放,如果不在就调用start()开始播放。当你点击暂停按钮时,会判断音频是否在播放,如果在就调用pause()暂停音频。当你点击停止按钮的时候,会判断音频是否在播放,如果在播放就调用reset()将音频重置为初创建的状态,然后重新调用initMediaPlayer()方法。
最后,在onDestroy()方法中调用stop()方法和release()方法,将MediaPlayer资源释放掉。
AndroidManifest.xml权限代码
千万别忘记了去声明权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这样,我们的播放音频的程序就做完了,就可以运行在手机上了。运行到手机上后,要记得去手动添加一下这个程序的权限哦~
播放视频
刚刚我们完成了播放音频的简易小程序,现在让我们来看看播放视频的小程序吧!
activity_main.xml代码
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="播放"/>
<Button
android:id="@+id/pause"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="暂停"/>
<Button
android:id="@+id/replay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="重新播放"/>
</LinearLayout>
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
这里,我们放置了三个按钮,分别用于控制视频的播放。暂停和重新播放。一个VideoView,用于显示视频。
MainActivity.java 代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView=findViewById(R.id.video_view);//videoView实例
Button play = findViewById(R.id.play);//播放按钮实例
Button pause = findViewById(R.id.pause);//暂停按钮实例
Button replay = findViewById(R.id.replay);//重新播放按钮实例
play.setOnClickListener(this);
pause.setOnClickListener(this);
replay.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 {
//初始化MediaPlayer
initVideoPath();
}
}
private void initVideoPath(){
File file = new File(Environment.getExternalStorageDirectory(),"movie1.mp4");
videoView.setVideoPath(file.getPath());//指定视频文件的路径
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
initVideoPath();
}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(!videoView.isPlaying()){
videoView.start();
}
break;
case R.id.pause:
if(videoView.isPlaying()){
videoView.pause();
}
break;
case R.id.replay:
if(videoView.isPlaying()){
videoView.resume();
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(videoView != null){
videoView.suspend();
}
}
}
这里的代码,有没有觉得很熟悉呢?没错它和我们上面的音频代码差不多,只是做了一下改动。
首先,我们在onCreate()方法中动态申请权限,当用户同意权限后,启动initVideoPath()方法来设置视频文件的路径。这里,我们同样需要事先在SD卡的根目录下放置一个视频文件,名字自己定义。
然后是按钮的点击事件,当点击播放按钮时会进行判断,如果视频不在播放,就会调用start()播放视频。当点击暂停按钮时会判断,如果视频正在播放,就调用pause()暂停播放。当点击重新播放按钮时会判断,如果视频正在播放,则调用resume()重新播放视频。
最后,在onDestroy()方法中,调用suspend()方法,将VideoView所占用的资源释放掉。
AndroidManifest.xml权限代码
千万别忘记了去声明权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这样,我们的播放视频的程序就做完了,就可以运行在手机上了。运行到手机上后,要记得去手动添加一下这个程序的权限哦~
MediaPlayer播放音频与视频的总结
获得MediaPlayer实例
①直接new创建
MediaPlayer mp = new MediaPlayer( );
②调用create方法创建
MediaPlayer mp = MediaPlayer.create(this,R.raw.test);//无需再调用setDataSource
设置播放文件
⑴raw文件包下的资源:
MediaPlayer.create(this,R.raw.test);
⑵本地文件路径:
mp.setDataSource(“/sdcard/test.mp3”);
⑶网络URL文件:
mp.setDataSource(“http://www.xxx.com/music/test.mp3”);
其他方法
方法 | 方法解释 |
---|---|
getCurrentPosition( ) | 得到当前的播放位置 |
getDuration( ) | 得到文件的时间 |
getVideoHeight( ) | 得到视频高度 |
getVideoWidth( ) | 得到视频宽度 |
isLooping( ) | 是否循环播放 |
isPlaying( ) | 是否正在播放 |
pause( ) | 暂停 |
prepare() | 准备(同步) |
prepareAsync( ) | 准备(异步) |
release( ) | 释放MediaPlayer对象 |
reset( ) | 重置MediaPlayer对象 |
seekTo(int msec) | 指定播放的位置(以毫秒为单位的时间 |
setAudioStreamType(int streamtype) | 指定流媒体的类型 |
setDisplay(SurfaceHolder sh) | 设置用SurfaceHolder来显示多媒体 |
setLooping(boolean looping) | 设置是否循环播放 |
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) | 网络流媒体的缓冲监听 |
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) | 网络流媒体播放结束监听 |
setOnErrorListener(MediaPlayer.OnErrorListener listener) | 设置错误信息监听 |
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) | 视频尺寸监听 |
setScreenOnWhilePlaying(boolean screenOn) | 设置是否使用SurfaceHolder显示 |
setVolume(float leftVolume, float rightVolume) | 设置音量 |
start( ) | 开始播放 |
stop( ) | 停止播放 |