音频播放

在 Android 中播放音频文件一般都是使用 MediaPlayer 类来实现的,它对多种格式的音
频文件提供了非常全面的控制方法,从而使得播放音乐的工作变得十分简单。下表列出了
MediaPlayer 类中一些较为常用的控制方法。
方法名         功能描述
setDataSource()  设置要播放的音频文件的位置。
prepare()     在开始播放之前调用这个方法完成准备工作。
start()       开始播放音频。(重头开始播放的,并且是再开启一个线程)
pause()       暂停播放音频。
reset()        将 MediaPlayer 对象重置到刚刚创建的状态。
seekTo()     从指定的位置开始播放音频。
stop()       停止播放音频。调用这个方法后的 MediaPlayer 对象无法再播放音频。
release()     释放掉与 MediaPlayer 对象相关的资源。
isPlaying()     判断当前 MediaPlayer 是否正在播放音频。
getDuration()  获取载入的音频文件的时长。

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

音乐播放结束的监听器:mediaPlayer.setOnCompletionListener

一种比较简单的播放方式,播放当前工程里的Mp3文件音频文件放res/raw下

 MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);//播放当前工程文件里的音频 sound_file_1为音频文件
  mp.setLooping(true);//设置为循环播放,默认为false
  mp.setVolume(1.0f, 1.0f);//设置音量为最大             上面的方法都可以使用,包括播放结束的监听
  mp.start();

播放短音乐:

//int maxStreams参数一:表示音乐池数量
        //int streamType 参数二:类型
        // int srcQuality参数三:资源的质量
        soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
        //将音乐加载到soundPool
        soundId = soundPool.load(this, R.raw.music, 1);

//播放小音乐,不用MediaPlayer是因为mediaplayer适合播放耗时的文件,并且比较消耗资源
                        /**
                         * int soundID 音乐
                         * float leftVolume左声道
                         * float rightVolume 右声道
                         * int priority
                         * int loop 循环播放
                         * float rate 优先级
                         */
                       soundPool.play(soundId,1.0f,1.0f,1,1,1.0f);//开始播放

另一种播放内存卡里的MP3文件的方式

代码如下:

public class MainActivity extends Activity implements OnClickListener {

    private MediaPlayer media;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button start=(Button) findViewById(R.id.start);
        Button stop=(Button) findViewById(R.id.stop);
        Button pause=(Button) findViewById(R.id.pause);
        start.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);
        initMediaPlayer();//初始化
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.start://开始播放
            if(!media.isPlaying()){
                media.start();
            }
            break;
        case R.id.pause://暂停播放
            if(media.isPlaying()){//如果正在播放
                media.pause();
            }
            break;
        case R.id.stop://结束播放
            if(media.isPlaying()){
                media.reset();//将 MediaPlayer 对象重置到刚刚创建的状态。
                initMediaPlayer();//使得继续按播放键时能播放
            }
            break;
        default:
            break;
        }
    }
    //初始化播放
    public void initMediaPlayer(){
        media = new MediaPlayer();
        File file=new File(Environment.getExternalStorageDirectory()+File.separator+"Music","ye.mp3");//MP3文件的路径
        System.out.println("该音频文件的时长:"+media.getDuration());
        try {
            media.setDataSource(file.getPath());//指定音频文件路径
            media.prepare();//进入准备状态
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(media!=null){
            media.stop();//该对象无法再播放
            media.release();//释放掉与该对象相关的资源
        }
    }
}

 播放网络上的音乐:

/*
MediaPlayer 试用起来很简单。然而,当我们将它集成在应用中时,需要特别留意一些注意点。举个例子,
prepare() 这个方法可能会执行很长时间,因为它会去获取并解析多媒体文件。所以这种耗时的操作,我们 千万不要在UI线程中去执行. 
这样的操作会阻塞UI线程,这是非常差的用户体验,并且有可能造成程序ANR(应用程序无响应)。
即使你觉得你的资源加载非常块,请记住任何花费 1/10 秒的操作都会造成可见的停滞,并且用户会觉得你的应用程序非常慢。
为了避免阻塞UI线程,可以开辟一个线程来准备 MediaPlayer,准备完成后通知UI线程。
可以自己写线程实现这样的异步操作,然而 MediaPlayer 提供了 prepareAsync() 方法来让我们更加容易实现这样的逻辑。
这个方法将在后台去准备多媒体的播放。当完成准备工作后,MediaPlayer.OnPreparedListener接口中的 onPrepared()方法将会执行,
这个接口是通过 setOnPreparedListener() 方法来设置的。
 */
//功能:播放网络音乐
public class MainActivity extends Activity implements OnClickListener {
    private MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button start=(Button) findViewById(R.id.start);
        final Button pause=(Button) findViewById(R.id.pause);//暂停播放
        start.setOnClickListener(this);
        pause.setOnClickListener(this);
        mp = new MediaPlayer();
        //指定网络音频资源
        String url="http://192.168.56.1:8080/mp3/ye.mp3";
        try {
            mp.setDataSource(url);//指定播放的网络资源
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置播放的流的类型
            //mp.prepare();//这是同步的准备
            mp.prepareAsync();//这是异步的准备,因为是获取网络上的音频,如果用同步会出现页面卡顿的现象
            //准备完毕的监听事件
            mp.setOnPreparedListener(new OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    System.out.println("歌曲播放准备完毕");
                }
            });
            //音乐播放结束的监听
            mp.setOnCompletionListener(new OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    System.out.println("音乐播放完毕");
                }
            });
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start:
                if(!mp.isPlaying()){
                    mp.start();
                }break;
            case R.id.pause:
                if(mp.isPlaying()){
                    mp.pause();
                }
                break;
        }
    }
}

 

posted @ 2016-05-05 19:17  ts-android  阅读(670)  评论(0编辑  收藏  举报