Android音频的播放

这篇博客详细介绍了Android平台上的音频播放,包括使用MediaPlayer类播放本地和网络资源,处理音频焦点变化和AUDIO_BECOMING_NOISY意图。文章还强调了在服务中使用MediaPlayer的重要性,以实现在后台播放音频,并讲解了如何申请和释放唤醒锁以维持后台播放。
摘要由CSDN通过智能技术生成

一、简介

Android的多媒体框架包括支持播放多种常见的媒体类型,使您可以轻松的把音频、视屏和图像集成到您的应用。您可以播放音频或视屏媒体文件,这些文件是存储在你的应用程序的资源文件中的。应用程序的资源文件可以是文件系统中独立的文件,或者通过网络连接获取的一个数据流,所有使用MediaPlayer APIS的资源文件。

注意:您只能在标准输出设备上播放音频数据。目前,标准输出设备是移动设备的扬声器或耳机。您不能在谈话音频调用期间播放声音文件。

1、基础
下面的类是Android框架中用于播放声音的类:
MediaPlayer:这个类主要用于播放声音和视屏
AudioManager:这个类主要管理音频和音频输出设备

2、声明Manifest文件
//网络权限申明

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

如果您的播放应用需要阻止屏幕变暗或者阻止处理器睡眠,或者使用MediaPlayer.setScreenOnWhielePlaying()或MedidaPlayer.setWakeMode()方法,需要加入下面的权限。
//唤醒锁申明

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

二、使用MediaPlayer

媒体框架中最重要的组件之一就是MediaPlayer类,此类的对象可以用少量的设置即能获取,解码和播放音频视屏,它支持多种媒体源,比如:

  • 本地资源
  • 内部URI,比如从您的ContentResolver取得的URI
  • 外部URI(媒体流)

1、播放本地资源

//播放本地资源文件,create方法中包括了setDataSource和prepare的执行
MediaPlayer _mp = MediaPlayer.create(this, R.raw.millets);
_mp.start();

2、播放一个本地URI

//播放文本文件的资源文件
                String _path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/millets.mp4";
                try {
                    //也可以采用这种方式创建对象
                    MediaPlayer _mpFile = new MediaPlayer();
                    _mpFile.setDataSource(this, Uri.parse(_path));
                    _mpFile.prepare();//同步执行
                    _mpFile.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }

3、播放网络地址

//播放网络的资源
                String _netPath = "http://.mp4";
                MediaPlayer _netMp = new MediaPlayer();
                try {
                    _netMp.setDataSource(this, Uri.parse(_netPath));
                    _netMp.prepareAsync();//异步执行
                    //需要等待prepareAsync准备结束后,回调通知才可以播放
                    _netMp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }

4、管理状态
MediaPlayer有一个内部的状态,因为特定的操作只能在特定的状态时才能有效。如果你在错误的状态下执行一个操作,系统可能抛出一个异常或者导致一个意外的行为。
这里写图片描述

5、释放MediaPlayer
MediaPlayer可能要消耗大量的系统资源。因此您应该总是采用一些额外的措施来确保在一个MediaPlayer实例上不会挂起太长的时间。当您用玩MediaPlayer时,您应该总是调用release()来保证任何分配给MeidaPlayer的系统资源被正确的释放。

mediaPlayer.release();
mediaPlayer = null;

6、完整例子:

public class MediaMainActivity extends BaseActivity implements View.OnClickListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
   

    //UI
    private android.widget.Button buttonpre;
    private android.widget.Button buttonstart;
    private android.widget.Button buttonpause;
    private android.widget.Button buttonnext;
    private MediaPlayer mMediaPlayer;

    //data
    private ArrayList<String> mMusicList;
    private int mMusicIndex = 0;
    private boolean isPaused = false;

    @Override
    public void initData(Bundle savedInstanceState) {
        //init music data
        String _musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
        String _a = _musicPath + File.separator + "mbc.mp3";
        String _b = _musicPath + File.separator + "rgyzd.mp3";
        String _c = _musicPath + File.separator + "rga.mp3";
        String _d = _musicPath + File.separator + "zxk.mp3";
        String _e = _musicPath + File.separator + "aj.mp3";
        mMusicList = new ArrayList<>();
        mMusicList.add(_a);
        mMusicList.add(_b);
        mMusicList.add(_c);
        mMusicList.add(_d);
        mMusicList.add(_e);
        //init media
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnErrorListener(this);
    }

    @Override
    public void initView(Bundle savedInstanceState) {
        setContentView(R.layout.activity_media_main);
        this.buttonnext = (Button) findViewById(R.id.button_next);
        this.buttonnext.setOnClickListener(this);
        this.buttonpause = (Button) findViewById(R.id.button_pause);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值