用MediaPlayer实现在线音乐播放

来源:互联网 发布:刘若英我知谁掌管明天 编辑:程序博客网 时间:2024/05/16 02:56

使用MediaPlayer播放音乐,基本步骤:

(1)生成MediaPlayer对象,根据播放文件的地方使用不同的生成方法(参考MediaPlayer API)。

(2)得到MediaPlayer对象后,根据实际需要调用不同方法,如start()、stop()、pause()、release()等。

MediaPlayer对象的状态: 

  

                                                       

(1)当一个MediaPlayer对象刚刚用new操作符创建或调用reset()方法后,他就处于Idle状态,当调用release()方法后,他就处于End状态,这两种状态之间是Mediaplayer对象的生命周期。

(2)调用setDataSource()方法会使出于Idle状态的对象迁移到Initialized状态。

(3)在开始播放之前,MediaPlayer对象必须要处于Prepared状态。

  • 调用prepare()方法(同步):此方法返回表示该mediaPlayer对象已经进入Prepared状态
  • 调用prepareAsync()方法(异步):此方法会使MediaPlayer对象进入Preparing状态并返回,而内部的播放引擎会继续未完成的准备工作。
当同步方法返回时或异步方法的准备工作完成时就会调用客户端程序提供的OnPreparedListener.onPrepared()监听方法。可以调用MediaPlayer.setOnPreparedListener(android.meida.MediaPlayer.OnpreparedListener());方法来注册OnpreparedListener.
(4)在要播放时必须调用start()方法,当此方法成功返回时,MediaPlayer对象处于started状态。当处于started状态时,内部的播放引擎会调用客户端程序提供的OnBufferingUpdateListener.onBufferingUpdate()回调方法,此方法允许应用程序追踪流波放的缓冲状态,对于一个已经处于缓冲状态的MediaPlayer对象调用start()方法没有影响。
(5)播放可以被暂停以及调整当前位置,当调用pause()回事当前对象进入pause状态。调用stop()方法会使播放停止,调用seekTo()方法可以调整播放的位置。
(6)当播放到流的末尾时完成播放。如果没有调用setLooping(boolean)方法开启循环模式,那么内部的播放引擎会调用客户端程序提供的OnCompletion.onCompletion()回调方法。内部的播放引擎一旦调用了OnCompletiion.onCompletion()回调方法,则说明这个MediaPlayer对象进入了PlayBackComPleted状态。当处于PlaybackCompleted状态时,可以再调用start()方法让这个MediaPlayer对象再次进入启动状态。
MP3Player.java
package com.fzw.mp3player;import android.media.MediaPlayer;import android.media.MediaPlayer.OnBufferingUpdateListener;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaPlayer.OnErrorListener;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MP3Player extends ActionBarActivity implementsOnErrorListener,OnBufferingUpdateListener,OnCompletionListener,OnClickListener,OnPreparedListener{private TextView statusView;private TextView bufferView;private Button playButton;private Button pauseButton;private MediaPlayer mPlayer=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                init();    }    private void init(){    statusView=(TextView)findViewById(R.id.statusview);    bufferView=(TextView)findViewById(R.id.bufferview);    playButton=(Button)findViewById(R.id.playButton);    pauseButton=(Button)findViewById(R.id.pauseButton);        playButton.setEnabled(false);    pauseButton.setEnabled(false);    playButton.setOnClickListener(this);    pauseButton.setOnClickListener(this);    mPlayer=new MediaPlayer();        mPlayer.setOnErrorListener(this);    mPlayer.setOnBufferingUpdateListener(this);    mPlayer.setOnCompletionListener(this);    mPlayer.setOnPreparedListener(this);        statusView.setText("mediaplayer created");        try {    //调用setDataSource方法,传入音频文件的http位置,此时处于Initialized状态mPlayer.setDataSource("http://yinyueshiting.baidu.com/data2/music/123000197/64751879200128.mp3?xcode=a418dadf8b6675d26d68292374921cf6ee5844c2417c39ce");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}        statusView.setText("setDataSource done");    statusView.setText("calling prepareAsync");    /**     * 调用prepareAsync方法,试MediaPlayer对象进入Preparing状态,让内部播放引擎继续未完成的准备工作。     */    mPlayer.prepareAsync();    }        /**     * 当prepareAsync方法完成时,将调用onPrepared()方法,表明音频准备播放。     */@Overridepublic void onPrepared(MediaPlayer mp) {// TODO Auto-generated method stubstatusView.setText("onPrepared called");playButton.setEnabled(true);}        @Overridepublic void onClick(View v) {// TODO Auto-generated method stub    if(v==playButton){    //if(mPlayer.isPlaying()){    mPlayer.start();    statusView.setText("start called");    playButton.setEnabled(false);    pauseButton.setEnabled(true);    //}    }    else if(v==pauseButton){    mPlayer.pause();    statusView.setText("pause called");    playButton.setEnabled(true);    pauseButton.setEnabled(false);    }        }    /** * 当MediaPlayer完成播放音频文件时,将调用onCompletion方法。 * 此时设置“播放”按钮可点击,“暂停”按钮不能点击 */@Overridepublic void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stubstatusView.setText("onCompletion called");playButton.setEnabled(true);pauseButton.setEnabled(false);}//当MediaPlayer正在缓冲的时候,将调用该Activity的onBufferingUpdate方法。@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {// TODO Auto-generated method stubbufferView.setText(""+percent+"%");}/** * 如果MediaPlayer出现错误,将调用onError方法。 */@Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {// TODO Auto-generated method stubreturn false;}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();mPlayer.stop();}/**     * 当按手机上的返回按键的时候,会自动调用系统的onKeyDown方法,     * 而onKeyDown方法右会自动调用onDestroy()方法     * 销毁该Activity,此时如果onDestroy()方法不重写,那么正在播放     * 的音乐不会停止,所以这时候要重写onDestroy()方法,     * 在该方法中,加入mediaplayer.stop()方法,表示按返回键的时候,     * 会调用mediaPlayer对象的stop方法,     * 从而停止音乐的播放     *      */@Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.mp3_player, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}
main.xml
<LinearLayout xmlns: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"    android:orientation="vertical"    tools:context="com.fzw.mp3player.MP3Player" >    <TextView        android:id="@+id/status"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="status" />    <TextView         android:id="@+id/statusview"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="statusview"/>    <TextView         android:id="@+id/bufferview"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="%0"/>    <Button         android:id="@+id/playButton"        android:layout_width="match_parent"         android:layout_height="wrap_content"        android:text="播放"/>    <Button         android:id="@+id/pauseButton"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="暂停"/></LinearLayout>



0 0
原创粉丝点击