多媒体播放

1、简介

Android的多媒体框架包括支持播放多种常见的媒体类型,可以轻松地把音频、视频和图像集成到应用。

下面的类时Android框架中用于播放声音的类:

MediaPlayer:这个类主要用于播放声音和音频

AudioManager:这个类主要管理音频和音频输出设备。

清单文件声明:

Internet许可:如果你的使用的是基于网络内容的流媒体播放器,应用程序必须请求访问网络

<uses-permission android:name="android.permission.INTERNET" />

如果播放应用需要组织屏幕变暗或组织处理器睡眠,使用MediaPlayer.setScreenOnWhilePlaying()或MediaPlayer.setWakeMode()方法,必须使用以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

2、使用MediaPlayer

媒体框架中最重要的组件之一是MediaPlayer类,此类的对象可以用少量的设置技能获取,接纳和播放音视频。它支持多种媒体资源,比如本地资源、内部URI(比如你从ContentResolver取得的URI)和外部URI(流媒体)

    //播放系统文件
    public void playFronSys(View view) {
        MediaPlayer mp = new MediaPlayer();
        String path = "C:\Users\Administrator\Documents\Tencent Files\784852312\FileRecv\MobileFile" + "/a1.aac";
        try {
            //设置数据源
            mp.setDataSource(this, Uri.parse(path));
            //同步执行
            mp.prepare();
            //执行完prepare在执行start
            mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //播放网络资源
    public void playfromNet(View view) {
        String path = "网络地址";
        final MediaPlayer mp = new MediaPlayer();
        try {
            mp.setDataSource(this, Uri.parse(path));
            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mp.start();
                }
            });
            //异步执行
            mp.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3、使用服务控制MediaPlayer

管理状态:

MediaPlayer有一个内部的状态,因为特定的操作只能在特定的状态时才能有效。如果在错误的状态下执行一个操作,系统可能抛出一个异常或导致一个意外的发生。

释放MediaPlayer

MediaPlayer可能消耗大量的系统资源,因此当时使用完MediaPlayer时,应该调用release()来保证分配给MediaPlayer的系统资源被正确的释放。

mediaPlayer.release();

mediaPlayer = null;

/**
 * 简单的播放器实现
 */
public class MainActivity extends Activity implements View.OnClickListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {

    private MediaPlayer mediaPlayer;
    private ArrayList<String> mList = new ArrayList<>();
    //表示当前要播放音乐的索引
    private int index = 0;
    private Button btn_play, btn_pause, btn_next, btn_prev;
    //true表示暂停状态
    private boolean isPause = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnCompletionListener(this);

    }

    private void initView() {
        btn_play = (Button) findViewById(R.id.btn_play);
        btn_pause = (Button) findViewById(R.id.btn_pause);
        btn_next = (Button) findViewById(R.id.btn_next);
        btn_prev = (Button) findViewById(R.id.btn_prev);
    }

    private void iniMusic() {
        String root = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MUSIC).getPath();
        mList.add(root + File.separator + "a1.mp3");
        mList.add(root + File.separator + "a2.mp3");
        mList.add(root + File.separator + "a3.mp3");
        mList.add(root + File.separator + "a4.mp3");
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_play:
                play();
                break;
            case R.id.btn_next:
                pause();
                break;
            case R.id.btn_pause:
                next();
                break;
            case R.id.btn_prev:
                prev();
                break;
        }
    }

    private void prev() {
        if (index - 1 >= 0) {
            index--;
        } else {
            index = mList.size() - 1;
        }
        start();
    }

    private void next() {
        if (index + 1 < mList.size()) {
            index++;
        }
    }

    private void pause() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            isPause = true;
        }
    }

    //播放
    public void play() {
        if (isPause) {
            mediaPlayer.start();
        } else {
            start();
        }
    }

    //从头开始播放
    private void start() {
        if (index < mList.size()) {
            String musicPath = mList.get(index);
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
            //重置
            mediaPlayer.reset();
            try {
                mediaPlayer.setDataSource(musicPath);
                mediaPlayer.prepareAsync();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        isPause = false;
    }

    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        return false;
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        mediaPlayer.start();
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {

    }
}

4、处理音频焦点

要请求音频焦点,必须从AudioManager调用requestAudioFocus()

5、处理AUDIO_BECOMING_NOISY意图

6、从ContentResolver获取媒体

原文地址:https://www.cnblogs.com/chhom/p/4765488.html