第一个参数是当前上下文,第二个参数为需要加锁的状态,被设定为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= ((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(); }
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唤醒锁及音频焦点,布布扣,bubuko.com
Android多媒体-MediaPlayer唤醒锁及音频焦点
原文:http://blog.csdn.net/familyhappylife/article/details/29810063