MediaPlayer

本文提供了一个详细的指南,展示了如何在Android应用中实现音乐播放功能,包括加载本地音乐、内存卡音乐和网络音乐,并通过线程控制播放进度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法:

装载音频文件:

StaticMediaPlayer  1.create(Context context,Uriuri,SurfaceHolder holder)

                指定从资源ID对应的资源文件中来装载音乐文件,同时指定了SurfaceHolder对象并返回MediaPlayer对象

  2.create(Context context,intresid)

  指定从资源ID对应的资源文件中来装载音乐,并返回新创建的MediaPlayer对象

  3.create(Context context,Uriuri)

  从指定Uri装在音频文件,并返回新创建的MediaPlayer对象。

 

1getCurrentPosition()     获取当前播放位置                              

2getDuration()            获取音频的时常                               

3isPlaying()                                     判断MediaPlayer是否正在播放                                             

4pause()                                         暂停播放                                                                                     

5prepare()               准备播放,会使MediaPlayer进入Prepared状态     

6seekTo(int msec)        寻找指定的时间位置                            

7getVideoHeight()        获取视频的高度                                 

8getVideoWidth()         获取视频的宽度                                 

9isLooping()             判断MediaPlayer是否正在循环播放               

10prepareAsync()         准备播放异步音频                               

11release()              释放媒体资源                                  

12reset()                重置MediaPlayer进入未初始化状态                

13setAudioStreamType(int streamtype) 设置音频流的类型                   

14setDataSource(String path) 指定装载path路径所代表的文件               

15、setDataSource(Context context, Uri uri, Map<String, Stringheaders)指定装载uri所代表的文件   16、setDataSource(Context context, Uri uri)指定装载uri所代表的文件。       

17setDataSource(FileDescriptor fd, longoffset, long length)指定装载fd所代表的文件中从offset开始长度为length的文件内容。

18setDataSource(FileDescriptor fd)指定装载fd所代表的文件。

 

Tip:执行上面的setDataSource()方法后,MediaPlayer并未真正去装载那些音频文件,还需要调用MediaPlayerperpare()方法去准备音频,

      所谓准备,就是让MediaPlayer真正去装载音频文件。

       eg:mp.setDataSource(M/mnt/sdcard/next.mp3);

      mp.prepare();//准备播放

             mp.start();   //播放

如果MediaPlayer实列是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create()方法里已经调用过了。

 

 

 

19setDisplay(SurfaceHolder sh)   设置显示方式

20setLooping(boolean looping)   设置是否循环播放

21setNextMediaPlayer(MediaPlayer next)    设置当前流媒体播放完毕,下一个播放的MediaPlayer

22setScreenOnWhilePlaying(booleanscreenOn) 设置是否使用SurfaceHolder来显示

23setSurface(Surface surface)  设置Surface

24setVideoScalingMode(int mode)设置视屏缩放的模式

25setVolume(float leftVolume,floatrightVolume)设置播放的音量

26setWakeMode(Context context,int mode) MediaPlayer设置低级电源管理行为

27start()  开始或恢复播放

28stop()停止播放

29seekTo()是定位方法,可以让播放器从指定的位置开始播放

 

1setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListenerlistener) 

        注册一个回调函数,在网络视频缓冲变化时调用

2setOnCompletionListener(MediaPlayer.OnCompletionListener listener)

   MediaPlayer的播放完成事件绑定事件监听器

3setOnErrorListener(MediaPlayer.OnErrorListenerlistener)

       MediaPlayer的播放错误事件绑定事件监听器

4setOnPreparedListener(MediaPlayer.OnPreparedListenerlistener)

     MediaPlayer调用prepare()方法时触发该监听器

5setOnSeekCompleteListener(MediaPlayer.onSeekCompleteListener listener)

  MediaPlayer调用seek()方法时触发该监听器

6setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)

      注册一个用于监听视频大小改变的监听器

 

 

 

代码部分:1、播放项目里的音乐

package com.autoseekbar;

 

importandroid.app.Activity;

importandroid.media.MediaPlayer;

importandroid.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

importandroid.os.SystemClock;

import android.view.View;

importandroid.widget.ImageButton;

importandroid.widget.SeekBar;

importandroid.widget.SeekBar.OnSeekBarChangeListener;

 

public class MainActivityextends Activity {

privateSeekBar seekBar;

privateMediaPlayer mp;

privateMyTherad myTherad;

privateImageButton imageButton;

privateboolean isPlaying = true;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

seekBar= (SeekBar) findViewById(R.id.seek_bar);

myTherad= new MyTherad();

seekBar.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {

//停止拖动事件监听

@Override

publicvoid onStopTrackingTouch(SeekBar seekBar) {

mp.seekTo(seekBar.getProgress());

}

//开始拖动事件监听

@Override

publicvoid onStartTrackingTouch(SeekBar seekBar) {

 

}

//进度值改变事件监听

@Override

publicvoid onProgressChanged(SeekBar seekBar, int progress,

booleanfromUser) {

}

});

}

/**播放/暂停按钮 */

publicvoid player(View view) {

imageButton= (ImageButton) view;

if(mp == null){//如果mp==null,则说明音乐从未播放过

mp =MediaPlayer.create(this, R.raw.life);//播放项目中的音乐

inttime = mp.getDuration();//得到播放的时间长

seekBar.setMax(time);//将seekBar的长设成音乐的长度

mp.start();//播放音乐

imageButton.setImageResource(R.drawable.start);//将按钮图标变成音乐正在播放的图标

changeProgress();//同时改变进度条的位置

//当音乐播放完成时调用这个监听

mp.setOnCompletionListener(newOnCompletionListener() {

@Override

publicvoid onCompletion(MediaPlayer mp) {

seekBar.setProgress(0);//将进度条设成开始状态

mp.seekTo(0);

mp.start();//重新播放(循环)

myTherad= new MyTherad();

changeProgress();

}

});

}elseif(mp.isPlaying()){//音乐正在播放时

mp.pause();//暂停音乐

imageButton.setImageResource(R.drawable.start);

isPlaying= false;

myTherad= null;

}else{//音乐结束

myTherad= new MyTherad();

isPlaying= true;//将音乐设于可播放状态

mp.start();//继续播放

imageButton.setImageResource(R.drawable.stop);

changeProgress();

}

}

/**开启线程 */

publicvoid changeProgress(){

myTherad.start();

}

/** 用线程来控制seekBar的移动 */

classMyTherad extends Thread{

publicvoid run(){

while(true){

intcurrentPosition = mp.getCurrentPosition();//得到音乐播放的位置

seekBar.setProgress(currentPosition);//将seekBar设置到当前位置

if(seekBar.getProgress() == seekBar.getMax()){//当seekBar移动到进度条的最后面时停止移动

break;

}

if (!isPlaying) {//音乐停止播放seekbar也停止

break;

}

SystemClock.sleep(100);//100毫秒移动一下

}

}

}

@Override

protected void onDestroy() {//activity退出时释放音乐

mp.release();

mp.seekTo(0);

super.onDestroy();

}

}

 

2、播放内存卡的音乐

package com.autoseekbar;

 

importjava.io.IOException;

importandroid.app.Activity;

importandroid.media.AudioManager;

importandroid.media.MediaPlayer;

importandroid.media.MediaPlayer.OnBufferingUpdateListener;

importandroid.media.MediaPlayer.OnCompletionListener;

importandroid.media.MediaPlayer.OnPreparedListener;

import android.net.Uri;

import android.os.Bundle;

importandroid.os.Environment;

importandroid.os.SystemClock;

import android.view.View;

importandroid.widget.ImageButton;

importandroid.widget.SeekBar;

importandroid.widget.SeekBar.OnSeekBarChangeListener;

 

public classSDCardActivity extends Activity {

privateSeekBar seekBar;

privateMediaPlayer mp;

privateMyTherad myTherad;

privateImageButton imageButton;

privateboolean isPlaying = true;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

seekBar= (SeekBar) findViewById(R.id.seek_bar);

myTherad= new MyTherad();

seekBar.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {

@Override

publicvoid onStopTrackingTouch(SeekBar seekBar) {

mp.seekTo(seekBar.getProgress());

}

@Override

publicvoid onStartTrackingTouch(SeekBar seekBar) {

 

}

@Override

publicvoid onProgressChanged(SeekBar seekBar, int progress,

booleanfromUser) {

 

}

});

 

}

/**播放/暂停按钮*/

publicvoid player(View view) {

imageButton= (ImageButton) view;

if(mp== null){//如果mp==null,则说明音乐从未播放过

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

StringsdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();

mp =new MediaPlayer();

try {

mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

mp.setDataSource(this,Uri.parse("file://"+sdcardPath+"/first.mp3"));

mp.prepare();

} catch(IllegalArgumentException e) {

e.printStackTrace();

} catch(SecurityException e) {

e.printStackTrace();

} catch(IllegalStateException e) {

e.printStackTrace();

} catch(IOException e) {

e.printStackTrace();

}

}

inttime = mp.getDuration();

seekBar.setMax(time);

mp.start();

imageButton.setImageResource(R.drawable.stop);

changeProgress();

mp.setOnCompletionListener(newOnCompletionListener() {

@Override

publicvoid onCompletion(MediaPlayer mp) {

seekBar.setProgress(0);//将进度条设成开始状态

mp.seekTo(0);

mp.start();//重新播放(循环)

myTherad= new MyTherad();

changeProgress();

}

});

}elseif(mp.isPlaying()){//音乐正在播放时

mp.pause();//暂停音乐

imageButton.setImageResource(R.drawable.start);

isPlaying= false;

myTherad= null;

}else{//音乐结束

myTherad= new MyTherad();

isPlaying= true;//将音乐设于可播放状态

mp.start();//继续播放

imageButton.setImageResource(R.drawable.stop);

changeProgress();

}

}

/**开启线程*/

publicvoid changeProgress(){

myTherad.start();

}

/**用线程来控制seekBar的移动 */

classMyTherad extends Thread{

publicvoid run(){

while(true){

intcurrentPosition = mp.getCurrentPosition();//得到音乐播放的位置

seekBar.setProgress(currentPosition);//将seekBar设置到当前位置

if(seekBar.getProgress()== seekBar.getMax()){//当seekBar移动到进度条的最后面时停止移动

break;

}

if(!isPlaying) {//音乐停止播放seekbar也停止

break;

}

SystemClock.sleep(100);//100毫秒移动一下

}

}

}

}

 

3、播放联网音乐

package com.autoseekbar;

 

importjava.io.IOException;

importandroid.app.Activity;

importandroid.media.AudioManager;

importandroid.media.MediaPlayer;

importandroid.media.MediaPlayer.OnBufferingUpdateListener;

importandroid.media.MediaPlayer.OnCompletionListener;

importandroid.media.MediaPlayer.OnPreparedListener;

import android.net.Uri;

import android.os.Bundle;

importandroid.os.Environment;

importandroid.os.SystemClock;

import android.view.View;

importandroid.widget.ImageButton;

importandroid.widget.SeekBar;

importandroid.widget.SeekBar.OnSeekBarChangeListener;

/**

 * 播放联网音乐

 * @author rou

 * @date 2016年3月24日

 */

public classIntentActivity extends Activity {

 

privateSeekBar seekBar;

privateMediaPlayer mp;

privateMyTherad myTherad;

privateImageButton imageButton;

privateboolean isPlaying = true;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

seekBar= (SeekBar) findViewById(R.id.seek_bar);

myTherad= new MyTherad();

seekBar.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {

@Override

publicvoid onStopTrackingTouch(SeekBar seekBar) {

mp.seekTo(seekBar.getProgress());

}

@Override

publicvoid onStartTrackingTouch(SeekBar seekBar) {

 

}

@Override

publicvoid onProgressChanged(SeekBar seekBar, int progress,

booleanfromUser) {

}

});

 

}

/**播放/暂停按钮*/

publicvoid player(View view) {

imageButton= (ImageButton) view;

if(mp== null){//如果mp==null,则说明音乐从未播放过

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

StringsdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();

mp =new MediaPlayer();

try {

mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

mp.setDataSource(this,Uri.parse(""));

mp.prepareAsync();

} catch(IllegalArgumentException e) {

e.printStackTrace();

} catch(SecurityException e) {

e.printStackTrace();

} catch(IllegalStateException e) {

e.printStackTrace();

} catch(IOException e) {

e.printStackTrace();

}

}

mp.setOnPreparedListener(newOnPreparedListener() {

@Override

publicvoid onPrepared(MediaPlayer mp) {

inttime = mp.getDuration();

seekBar.setMax(time);

mp.start();

imageButton.setImageResource(R.drawable.start);//将按钮图标变成音乐正在播放的图标

}

});

mp.setOnBufferingUpdateListener(newOnBufferingUpdateListener() {

@Override

publicvoid onBufferingUpdate(MediaPlayer mp, int percent) {

    int buf = seekBar.getMax()/100*percent;

    seekBar.setSecondaryProgress(buf);

}

});

mp.setOnCompletionListener(newOnCompletionListener() {

@Override

publicvoid onCompletion(MediaPlayer mp) {

seekBar.setProgress(0);//将进度条设成开始状态

mp.seekTo(0);

mp.start();//重新播放(循环)

myTherad= new MyTherad();

changeProgress();

}

});

}elseif(mp.isPlaying()){//音乐正在播放时

mp.pause();//暂停音乐

imageButton.setImageResource(R.drawable.start);

isPlaying= false;

myTherad= null;

}else{//音乐结束

myTherad= new MyTherad();

isPlaying= true;//将音乐设于可播放状态

mp.start();//继续播放

imageButton.setImageResource(R.drawable.stop);

changeProgress();

}

}

/**开启线程*/

publicvoid changeProgress(){

myTherad.start();

}

/**用线程来控制seekBar的移动 */

classMyTherad extends Thread{

publicvoid run(){

while(true){

intcurrentPosition = mp.getCurrentPosition();//得到音乐播放的位置

seekBar.setProgress(currentPosition);//将seekBar设置到当前位置

if(seekBar.getProgress()== seekBar.getMax()){//当seekBar移动到进度条的最后面时停止移动

break;

}

if(!isPlaying) {//音乐停止播放seekbar也停止

break;

}

SystemClock.sleep(100);//100毫秒移动一下

}

}

}

}

 

布局:

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context="${relativePackage}.${activityClass}" >

 

     <SeekBar 

      android:id="@+id/seek_bar" 

      android:layout_width="fill_parent" 

      android:layout_height="wrap_content" 

      android:layout_centerInParent="true" 

       android:minHeight="5dip" 

       android:maxHeight="5dip"

       android:secondaryProgress="50"

      android:progressDrawable="@drawable/seek_img" 

      android:thumb="@drawable/thumb"  /> 

 

     <ImageButton

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="player"/>

 

</RelativeLayout>



MediaPlayerAndroid中用于播放音频和视频的类。它提供了一系列方法和回调函数,可以控制媒体的播放、暂停、停止以及获取和更新播放进度等操作。 在使用MediaPlayer之前,需要先创建一个MediaPlayer对象,并设置数据源。有两种方式可以创建MediaPlayer对象,一种是直接使用new关键字创建一个实例,然后调用setDataSource()方法设置数据源;另一种是使用MediaPlayerUtil类进行封装,通过init()方法进行初始化,并设置回调函数监听媒体状态的变化。 使用MediaPlayer时,可以通过调用start()方法开始播放音频,通过onPrepared()回调函数监听音频加载完成的事件,在此方法中可以取消加载进度条并开始播放。通过onSeekUpdate()回调函数可以更新播放进度条的状态。onCompletion()回调函数可以监听音频播放完成的事件。如果发生错误,可以调用reset()方法重置UI状态,并返回true表示处理错误。 关于MediaPlayer的更多详细信息,可以参考MediaPlayer的官方文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android 使用MediaPlayer播放音频详解](https://blog.youkuaiyun.com/baidu_38627723/article/details/120429916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值