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