Android之MediaPlayer的简单介绍之播放音乐
Android多媒体之MediaPlayer
Android应用增加动画,视频,音乐等多媒体功能,因此为手机提供音频录制,播放,视频录制,播放的功能十分重要。Android提供了常见音频,视频的编码,解码机制,Android支持的音频格式有MP3,WAV和3GP等,支持的视频格式有MP4和3GP等。 Android提供了这些多媒体的支持类,可以非常方便地在手机应用中播放音频,视频等。这些多媒体数据可以来自Android应用的资源文件,也可以来自外部存储器上的文件,也可以来自网络的文件流。
不仅如此,Android也提供了对摄像头,麦克风的支持,因此也可以十分方便地从外部采集照片,视频,音频等多媒体信息。
——音频和视频的播放
——MediaPlayer播放音频
1)MediaPalyer进行播放控制的方式:
start():开始或者恢复播放
stop():停止播放
pause():暂停播放
2)MediaPlayer装载指定音频文件的方式
static MediaPlayer create(Content,Uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。
static MediaPlayer create(Content,int resid):从redid资源ID来装载音频文件,并返回新创建的MediaPlayer对象。
上面这两个方法使用起来很简单,但这两个方法每次都会返回新的MediaPlayer.如果程序需要播放多个音频文件,使用该方法就不太合适了。此时可通过setDataSource方法装载指定的音频文件。
MediaPlayer m = new MediaPlayer():只需要创建一个对象
setDataSource(String path):指定装载path路径所代表的文件
setDataSource(FileDescriptor fs,long offset,long length):指定装载fd所代表的文件中从offset开始,长度为length的文件内容。
setDataSource(FileDescriptor fd):指定装载fd所代表的文件
setDataSource(Context,Uri):指定装载Uri所代表的文件
执行setDataSource方法之后,MediaPlayer并未真正装载那些音频文件,还需要调用prepare()方法准备装载音频。
3)播放应用raw的资源文件
MediaPlayer m=MediaPlayer.create(this,R.raw.apple);
m.start();
4)播放应用raw的资源文件
MediaPlayer m=new MediaPlayer();
m.setDataSource(Context,Uri.parse(
"android.resource://"+getPackageName()+"/"+R.raw.apple"))
5)播放应用的原始资源文件
a)调用Context的getAssets()获取AssetManager;
b)调用AssetManager的openFd(String name)方法打开指定的原生资源.返回AssetFileDescriptor对象
c)调用AssetFileDescriptor的getFileDescriptor()方法来获取音频文件的FileDescriptor.
d)创建MediaPlayer对象,调用setDataSource(FileDescriptor)方法。
e)调用MediaPlayer的prepare()方法准备音频
f)调用MediaPlayer的start(),stop(),pause()方法控制播放即可
5)播放外部存储器上音频文件
a)创建MediaPlayer对象,调用setDataSource("/sdcard/apple.mp3")
b)调用MediaPlayer对象的prepare()方法
c)调用MediaPlayer的start(),stop(),pause()方法控制播放即可
6)播放来自网络的音频文件
a)根据网络上的音频文件所在的位置创建Uri对象。
Uri uri = Uri.parse("http://www.baidu.com/song.mp3");
b)创建MediaPlayer对象,调用setDataSource(Context,Uri);
c)调用MediaPlayer对象的prepare()方法
d)调用MediaPlayer的start(),stop(),pause()方法控制播放即可
7)如播放下一首歌曲的代码:
mPlayer.reset();//空闲状态
mPlayer.setDataSource("/sdcard/gequ.mp3");
mPlayer.prepare();
mPlayer.start();
8)MediaPlayer还提供了事件监听器的方法
setOnCompletionListener():播放完成事件绑定事件监听器
setOnErrorListener():播放错误事件绑定事件监听器
setOnPreparedListener():调用prepare()方法时触发该监听器
setOnSeekCompleteListener():调用seek()方法时触发该监听器
9)Mediaplayer除了调用prepare()方法准备声音之外,
还可以调用
prepareAsync()来准备声音,他们的区别在于:
prepareAsync()是异步的,它不会阻塞当前的UI线程。
10)MediaPlayer的状态图
reset():清空MediaPlayer中的数据
setDataSource():设置音频数据
prepare():准备装载音频数据
prepareAsync():准备装载音频数据(异步)
seekTo():重新定位到音频数据的什么位置,单位毫秒
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
start():
pause():
stop():
release():释放MediaPlayer资源
11)其他的方法
setLooping(true):是否重复播放
setAudioStreamType()设置使用的音频流
A(播放音乐的界面)—>B
onPause()—>onCreate,onStart/onResume
—>onStop
实例:
先看效果吧:
接下来我就说下步骤:
1.音乐路径:
我们要把播放的音乐文件放在虚拟机的SD卡中,要到第一个0目录下面,按照下面这个图来~
2.播放音乐要MediaPlayer
MediaPlayer mediaPlayer=new MediaPlayer();
3.音乐的声音控制
AudioManager audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);
4.音乐的开始与暂停
public void start(View view){mediaPlayer.start();new Thread(){ public void run() { while(true){ try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//一秒 Message msg=handler.obtainMessage();msg.what=0x123;handler.sendMessage(msg); } }; }.start();} public void stop(View view){mediaPlayer.pause();}
5.布局:
6.Activity:
public class MainActivity extends Activity {private SeekBar sb1,sb2;private MediaPlayer mediaPlayer;private TextView tv;private AudioManager audioManager; private Handler handler =new Handler(){ //收到Handler发回的消息被回调 public void handleMessage(Message msg) { //更新UI组件 if(msg.what==0x123){ int current=mediaPlayer.getCurrentPosition(); sb1.setProgress(current); } } };public void start(View view){mediaPlayer.start();new Thread(){ public void run() { while(true){ try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//一秒 Message msg=handler.obtainMessage();msg.what=0x123;handler.sendMessage(msg); } }; }.start();} public void stop(View view){mediaPlayer.pause();} @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sb1=(SeekBar) findViewById(R.id.sb1);sb2=(SeekBar) findViewById(R.id.sb2);tv=(TextView) findViewById(R.id.tv);//实例了一个mediaplayer,并给它装在了音乐/*//这个方法使用起来很简单//但是这俩个方法每次都会返回新的MediaPlayer//如果程序需要播放多个音频文件//使用该方法不合适mediaPlayer=mediaPlayer.create(this, R.raw.music);*/mediaPlayer=new MediaPlayer();//加载资源文件try {String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/music.mp3";mediaPlayer.setDataSource(path);/*mediaPlayer.setDataSource(this, Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.music));*/ //如果是setDataSource,那么调用完这个文件之后,音频文件没有真正的加载//要调用prepare方法//异步的加载方式//mediaPlayer.prepareAsync();mediaPlayer.prepare();//设置循环播放mediaPlayer.setLooping(false);//mediaPlayer.setOnErrorListener(listener);//1.setLooping --false //2.在播放完成时触发mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stub//加载下一首Toast.makeText(MainActivity.this, "播放完成", 0).show();}});tv.setText(convert(mediaPlayer.getDuration()));sb1.setMax(mediaPlayer.getDuration());sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub//mediaPlayer.start();}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// TODO Auto-generated method stubif(fromUser){mediaPlayer.seekTo(progress);}}});audioManager=(AudioManager) getSystemService(AUDIO_SERVICE);sb2.setMax(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));sb2.setProgress(audioManager.getStreamMaxVolume(audioManager.STREAM_MUSIC));sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// TODO Auto-generated method stub//一句话audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_SHOW_UI);}});} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubif(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.stop();mediaPlayer.reset();mediaPlayer=null;//回收资源}super.onDestroy();}private String convert(int duration){//总秒int second=duration/1000;//总分int minute=second/60;//剩余秒数int miao=second%60;return minute+":"+miao;}}
更多相关文章
- Android——文件路径(/mnt/sdcard/...)、Uri(content://media/ex
- Android Cannas.drawTextView 方法坐标问题
- Android开机自启动程序设置及控制方法
- 64位 ubuntu android SDK 无法新建AVD,adb 没有那个文件或目录的
- Android随笔之——Android时间、日期相关类和方法
- Android开发---xml布局文件中的常见属性总结
- Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用
- Kernel.org 被黑,获取 Android 源码方法一则
- webservice二进制文件传输