zoukankan      html  css  js  c++  java
  • 多媒体播放

    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获取媒体

  • 相关阅读:
    insertSelective和insert的区别?
    @Valid和@BindingResult
    restful的put请求(坑),和HttpServletRequest做参数的作用
    ios网络编程读书笔记
    命令行杂记
    iOS杂记
    git项目收藏
    _Function_,_PRETTY_FUNCTION的区别
    iOS连接收藏
    转自别人的话
  • 原文地址:https://www.cnblogs.com/chhom/p/4765488.html
Copyright © 2011-2022 走看看