最近作直播播放,內核用的是騰訊超級播放器。屏幕鎖屏與打開時候遇到一些問題這裏進行陳述...爲了提高播放體驗,咱們老是 但願鎖屏暫停 開屏繼續播放的效果。bash
先上鎖屏類相關代碼:微信
public class ScreenLockController {
private Context mContext;
private IntentFilter mScreenStatusFilter = null;
private ScreenStatusListener mScreenStatusListener = null;
public ScreenLockController(Context context) {
mContext = context;
mScreenStatusFilter = new IntentFilter();
mScreenStatusFilter.addAction(Intent.ACTION_SCREEN_ON);
mScreenStatusFilter.addAction(Intent.ACTION_SCREEN_OFF);
mScreenStatusFilter.addAction(Intent.ACTION_USER_PRESENT);
}
private BroadcastReceiver mScreenStatusReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) { // 開屏
if (mScreenStatusListener != null) {
mScreenStatusListener.onScreenOn();
}
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 鎖屏
if (mScreenStatusListener != null) {
mScreenStatusListener.onScreenOff();
}
} else if (Intent.ACTION_USER_PRESENT.equals(action)) { //解鎖
if (mScreenStatusListener != null) {
mScreenStatusListener.userPresent();
}
}
}
};
//設置監聽
public void setScreenStatusListener(ScreenStatusListener l) {
mScreenStatusListener = l;
}
//開始監聽
public void startListen() {
if (mContext != null) {
mContext.registerReceiver(mScreenStatusReceiver, mScreenStatusFilter);
}
}
//結束監聽
public void stopListener() {
if (mContext != null) {
mContext.unregisterReceiver(mScreenStatusReceiver);
}
}
public interface ScreenStatusListener {
void onScreenOn();
void onScreenOff();
void userPresent();
}
}
複製代碼
播放器中SuperPlayer中使用 :ide
private ScreenLockController mScreenLockController;
//View init時候添加監聽
private void addScreenLockController(Context context) {
mScreenLockController = new ScreenLockController(context);
mScreenLockController.setScreenStatusListener(new ScreenLockController.ScreenStatusListener() {
@Override
public void onScreenOn() {
Log.d(TAG, "onScreen on ");
// onResume();
this.userPresent();
}
@Override
public void onScreenOff() {
Log.d(TAG, "onScreen off ");
onPause();
}
@Override
public void userPresent() {
//解鎖顯示view 以後
//view 對於用戶可見性判斷
if (isShown() && !screenOff()) {
onResume();
}
}
});
mScreenLockController.startListen();
}
//view 移除時候移除監聽
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mScreenLockController
.stopListener();
}
複製代碼
void onScreenOn(); 開屏 void onScreenOff();鎖屏 void userPresent();解鎖函數
剛開始我直接userPresent 以後設置onResume播放,後來發現遇到幾種狀況。ui
判斷屏幕是否時候解鎖。this
private boolean screenOff() {
KeyguardManager mKeyguardManager = (KeyguardManager) getContext().getSystemService(KEYGUARD_SERVICE);
if (mKeyguardManager.inKeyguardRestrictedInputMode()) {
// keyguard on
Log.d(TAG, "mKeyguardManager on ");
return true;
}
return false;
}
複製代碼