android MediaPlayer音频播放demo

本文介绍了MediaPlayer的使用方法,包括实例获取、文件设置、主要控制方法及监听器的设置。并通过一个简单的Demo展示了播放、暂停、停止按钮及音量调节进度条的实现。


网上搜了些关于MediaPlayer的资料

1)如何获得MediaPlayer实例:

可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);


2) 如何设置要播放的文件:
MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
MediaPlayer的setDataSource一共四个方法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
来设置datasource
 
3)对播放器的主要控制方法:
Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,
pause()和stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。


4)设置播放器的监听器:
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、

setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。

    自己做了个简单的demo来练练手:

    Demo很简陋,只提供了播放、暂停、停止按钮、以及音量调节进度条。


文件列表:

[plain]  view plain copy
  1. │  .classpath  
  2. │  .project  
  3. │  AndroidManifest.xml  
  4. │  ic_launcher-web.png  
  5. │  proguard-project.txt  
  6. │  project.properties  
  7. │    
  8. ├─.settings  
  9. │      org.eclipse.jdt.core.prefs  
  10. │        
  11. ├─assets  
  12. ├─bin  
  13. │  │  AndroidManifest.xml  
  14. │  │  classes.dex  
  15. │  │  resources.ap_  
  16. │  │  TestMediaPlayer.apk  
  17. │  │    
  18. │  ├─classes  
  19. │  │  └─com  
  20. │  │      └─example  
  21. │  │          └─testmediaplayer  
  22. │  │                  BuildConfig.class  
  23. │  │                  MainActivity.class  
  24. │  │                  R$attr.class  
  25. │  │                  R$drawable.class  
  26. │  │                  R$id.class  
  27. │  │                  R$layout.class  
  28. │  │                  R$menu.class  
  29. │  │                  R$raw.class  
  30. │  │                  R$string.class  
  31. │  │                  R$style.class  
  32. │  │                  R.class  
  33. │  │                    
  34. │  ├─dexedLibs  
  35. │  │      android-support-v4-214d66fac1308ecd3501641337a91f8a.jar  
  36. │  │        
  37. │  └─res  
  38. │      ├─drawable-hdpi  
  39. │      │      ic_launcher.png  
  40. │      │        
  41. │      ├─drawable-ldpi  
  42. │      │      ic_launcher.png  
  43. │      │        
  44. │      ├─drawable-mdpi  
  45. │      │      ic_launcher.png  
  46. │      │        
  47. │      └─drawable-xhdpi  
  48. │              ic_launcher.png  
  49. │                
  50. ├─gen  
  51. │  └─com  
  52. │      └─example  
  53. │          └─testmediaplayer  
  54. │                  BuildConfig.java  
  55. │                  R.java  
  56. │                    
  57. ├─libs  
  58. │      android-support-v4.jar  
  59. │        
  60. ├─res  
  61. │  ├─drawable-hdpi  
  62. │  │      ic_launcher.png  
  63. │  │        
  64. │  ├─drawable-ldpi  
  65. │  │      ic_launcher.png  
  66. │  │        
  67. │  ├─drawable-mdpi  
  68. │  │      ic_launcher.png  
  69. │  │        
  70. │  ├─drawable-xhdpi  
  71. │  │      ic_launcher.png  
  72. │  │        
  73. │  ├─layout  
  74. │  │      activity_main.xml  
  75. │  │        
  76. │  ├─menu  
  77. │  │      activity_main.xml  
  78. │  │        
  79. │  ├─raw  
  80. │  │      happyis.mp3  
  81. │  │        
  82. │  ├─values  
  83. │  │      strings.xml  
  84. │  │      styles.xml  
  85. │  │        
  86. │  ├─values-v11  
  87. │  │      styles.xml  
  88. │  │        
  89. │  └─values-v14  
  90. │          styles.xml  
  91. │            
  92. └─src  
  93.     └─com  
  94.         └─example  
  95.             └─testmediaplayer  
  96.                     MainActivity.java  
  97.                       

布局文件:

[html]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/LinearLayout2"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical"  
  7.     android:gravity="center_horizontal"  
  8.     tools:context=".MainActivity" >  
  9.   
  10.     <LinearLayout  
  11.         android:orientation="horizontal"  
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="wrap_content"  
  14.         android:gravity="center" >  
  15.   
  16.         <Button  
  17.             android:id="@+id/Play"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content"  
  20.             android:text="Play" />  
  21.   
  22.         <Button  
  23.             android:id="@+id/Pause"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:text="Pause" />  
  27.   
  28.         <Button  
  29.             android:id="@+id/Stop"  
  30.             android:layout_width="wrap_content"  
  31.             android:layout_height="wrap_content"  
  32.             android:text="Stop" />  
  33.     </LinearLayout>  
  34.     <SeekBar  
  35.         android:id="@+id/SoundSeekBar"  
  36.         android:layout_width="800dp"  
  37.         android:layout_height="wrap_content"  
  38.         android:max="100"  
  39.         android:progress="50" />  
  40.   
  41. </LinearLayout>  

主界面源代码:

[java]  view plain copy
  1. package com.example.testmediaplayer;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.media.AudioManager;  
  6. import android.media.MediaPlayer;  
  7. import android.os.Bundle;  
  8. import android.app.Activity;  
  9. import android.view.Menu;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.SeekBar;  
  14.   
  15. public class MainActivity extends Activity implements OnClickListener ,SeekBar.OnSeekBarChangeListener{  
  16.     private MediaPlayer mMediaPlayer=null;//媒体播放器  
  17.     private AudioManager mAudioManager=null;//声音管理器  
  18.     private Button mPlayButton=null;  
  19.     private Button mPauseButton=null;  
  20.     private Button mStopButton=null;  
  21.     private SeekBar mSoundSeekBar=null;   
  22.     private int maxStreamVolume;//最大音量  
  23.     private int currentStreamVolume;//当前音量  
  24.     private int setStreamVolume;//设置的音量  
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         mMediaPlayer=MediaPlayer.create(this, R.raw.happyis);//加载res/raw的happyis.mp3文件  
  30.         mAudioManager=(AudioManager)this.getSystemService(AUDIO_SERVICE);  
  31.         mPlayButton=(Button)findViewById(R.id.Play);  
  32.         mPauseButton=(Button)findViewById(R.id.Pause);  
  33.         mStopButton=(Button)findViewById(R.id.Stop);  
  34.         mSoundSeekBar=(SeekBar)findViewById(R.id.SoundSeekBar);  
  35.         mPlayButton.setOnClickListener(this);  
  36.         mPauseButton.setOnClickListener(this);  
  37.         mStopButton.setOnClickListener(this);  
  38.         maxStreamVolume=mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);  
  39.         currentStreamVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);  
  40.         mSoundSeekBar.setMax(maxStreamVolume);  
  41.         mSoundSeekBar.setProgress(currentStreamVolume);  
  42.         mSoundSeekBar.setOnSeekBarChangeListener(this);  
  43.     }  
  44.   
  45.     @Override  
  46.     public boolean onCreateOptionsMenu(Menu menu) {  
  47.         // Inflate the menu; this adds items to the action bar if it is present.  
  48.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  49.         return true;  
  50.     }  
  51.   
  52.     @Override  
  53.     public void onClick(View v) {  
  54.         // TODO Auto-generated method stub  
  55.         switch(v.getId()){  
  56.         case R.id.Play:  
  57.             mMediaPlayer.start();  
  58.             break;  
  59.         case R.id.Pause:  
  60.             mMediaPlayer.pause();  
  61.             break;  
  62.         case R.id.Stop:  
  63.             System.out.println("Stop");  
  64.             mMediaPlayer.stop();  
  65.             try{  
  66.             mMediaPlayer.prepare();  
  67.             }catch(IllegalStateException e){  
  68.                 e.printStackTrace();  
  69.             }catch(IOException e){  
  70.                 e.printStackTrace();  
  71.             }  
  72.             mMediaPlayer.seekTo(0);  
  73.             break;  
  74.         default:  
  75.             break;  
  76.         }  
  77.     }  
  78.       
  79.     //进度条变化  
  80.     @Override  
  81.     public void onProgressChanged(SeekBar seekBar, int progress,  
  82.             boolean fromUser) {  
  83.         // TODO Auto-generated method stub  
  84.         System.out.println("progress:"+String.valueOf(progress));  
  85.         mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_PLAY_SOUND);  
  86.     }  
  87.       
  88.     @Override  
  89.     public void onStartTrackingTouch(SeekBar seekBar) {  
  90.         // TODO Auto-generated method stub  
  91.           
  92.     }  
  93.       
  94.     @Override  
  95.     public void onStopTrackingTouch(SeekBar seekBar) {  
  96.         // TODO Auto-generated method stub  
  97.           
  98.     }  
  99.       
  100.     @Override  
  101.     protected void onDestroy() {  
  102.         // TODO Auto-generated method stub  
  103.         if(mMediaPlayer.isPlaying()){  
  104.             mMediaPlayer.stop();  
  105.             mMediaPlayer.release();  
  106.         }  
  107.         super.onDestroy();  
  108.     }  
  109.       
  110.     @Override  
  111.     public void onBackPressed() {  
  112.         // TODO Auto-generated method stub  
  113.         if(mMediaPlayer.isPlaying()){  
  114.             mMediaPlayer.stop();  
  115.             mMediaPlayer.release();  
  116.         }  
  117.         super.onBackPressed();  
  118.     }  
  119. }  

可运行源码下载:http://download.csdn.net/detail/wu_lai_314/6022053

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值