标签:tracking protect 任务 res lease btn 含义 睡眠状态 后台播放
确保在MediaPlayer执行的时候,哪怕系统睡眠了CUP也能正常执行。须要使用MediaPlayer.setWakeMode()为MediaPlayer设定唤醒锁。以下是setWakMode()的签名:
setWakeMode(Context context, int mode)
第一个參数是当前上下文,第二个參数为须要加锁的状态,被设定为int类型的常量,定义在PowerManager这个final类中。
PowerManager是专门用来管理Android功率消耗的锁定状态,与锁定CUP相关的,有四种,分别设定CUP、屏幕、键盘等的各种保持唤醒的状态。在这里仅仅须要设定为PARTIAL_WAKE_LOCK就可以。
mediaPlayer = new MediaPlayer(); // 设定CUP锁定 mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);一般对于锁而言。锁定了通常须要解锁。可是这里的唤醒说与MediaPlayer关联,所以仅仅须要在使用完之后release()释放MediaPlayer就可以,无需显式的为其解锁。在使用setWakeMode设定唤醒锁的时候,还必须为应用赋予对应的权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>再来说说怎样锁定wifi硬件在系统睡眠的时候保持正常执行。wifi锁通过WifiLock进行操作,而WifiLock通过WifiManager进行管理,通过WifiManager.createWifiLock()进行Wifi锁定。
第二个參数为WifiLock的标志,用于确定wifiLock的。
wifiLock= ((WifiManager) getSystemService(this.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock"); wifiLock.acquire();当然,在应用中把Wifi锁定之后。还须要在MediaPlayer.release()的时候为wifi硬件解锁。为避免意外关闭的情况,最好在Android组件的onDestory()里对其进行释放,释放Wifi锁使用WifiLock.release()。
/** * 停止播放 */ protected void stop() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; // 释放wifi锁 wifiLock.release(); btn_play.setEnabled(true); Toast.makeText(this, "停止播放", 0).show(); } } @Override protected void onDestroy() { // 在activity结束的时候回收资源 if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; // 释放wifi锁 wifiLock.release(); } super.onDestroy(); }
它的签名例如以下:
int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)
这种方法的返回值是int类型,其含义被定义在AudioManager中以常量表示AUDIOFOCUS_REQUEST_FAILED(获取音频焦点成功)、AUDIOFOCUS_REQUEST_GRANTED(获取音频焦点失败)。
当中重要的是第一个參数。为音频焦点变化的回调函数。在当中能够设定假设音频焦点变换了。当前应用怎样管理MediaPlayer。第二个參数为媒体流的类型,第三个參数为持续的状态。
AudioManager.OnAudioFocusChangeListener为音频焦点变换的监听器,当中须要实现一个方法:onAudioFocusChange(int focusChange)在音频焦点变换的时候回调。它有一个參数,为当前表示音频焦点对于当前应用的状态码。通过这个状态码指定相应的操作,有些时候音频状态改变了,并不一定须要停止音频的播放。
focusChange有一下几种状态码:
AUDIOFOCUS_GAIN:获得音频焦点。
AUDIOFOCUS_LOSS:失去音频焦点。而且会持续非常长时间。这是我们须要停止MediaPlayer的播放。
AUDIOFOCUS_LOSS_TRANSIENT:失去音频焦点,但并不会持续非常长时间,须要暂停MediaPlayer的播放。等待又一次获得音频焦点。
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:临时失去音频焦点,可是无需停止播放,仅仅需减少声音方法。
audioManager = (AudioManager) getSystemService(this.AUDIO_SERVICE); int result = audioManager.requestAudioFocus( new OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: // 获得音频焦点 if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } // 还原音量 mediaPlayer.setVolume(1.0f, 1.0f); break; case AudioManager.AUDIOFOCUS_LOSS: // 长久的失去音频焦点,释放MediaPlayer if (mediaPlayer.isPlaying()) mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: // 展示失去音频焦点,暂停播放等待又一次获得音频焦点 if (mediaPlayer.isPlaying()) mediaPlayer.pause(); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // 失去音频焦点,无需停止播放,减少声音就可以 if (mediaPlayer.isPlaying()) { mediaPlayer.setVolume(0.1f, 0.1f); } break; } } }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
以上就解说了MediaPlayer的一些高级的内容,在掌握了MediaPlayer的使用之后。开发有关音乐播放类的应用的时候就能够得心应手了。
从用户体验的方面出发,假设真实开发一款播放器类的软件,须要监听AUDIO_BECOMING_NOISY的广播,它会在音频输出源从其它输出源变换到设备扬声器的时候发出此广播。监听广播在音频输出源改变到设备扬声器的时候。停止播放。这样确保在耳机或额外的音频输出硬件与设备断开连接的时候。不至于又一次从扬声器继续输出音频播放。
源代码链接:http://download.csdn.net/detail/duanyu218/7475569
Android多媒体-MediaPlayer唤醒锁及音频焦点
标签:tracking protect 任务 res lease btn 含义 睡眠状态 后台播放
原文地址:http://www.cnblogs.com/yangykaifa/p/7144096.html