说明
最近做直播播放,内核用的是腾讯播放器。屏幕锁屏与打开时候遇到一些问题这里进行陈述...为了提升播放体验,我们希望锁屏暂停开屏继续播放的效果。
先上锁屏类相关代码:
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中使用 :
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播放,后来发现遇到几种情况。
1.对于华为mate 9和小米8手机,发现锁屏按键之后只是黑屏并不锁屏,会遇到直播无法播放情况, 只会调用onScreenOn 函数。所以onScreenOn 和 userPresent 应该用同样的播放逻辑。
- 大部分手机锁屏按键解锁显示之后会调用 userPresent ,但是假如此刻处于类似微信分享界面而没有分享,这时锁屏开屏视频会播放但是实际上视频播放页面对于用户是不可见的。 所以加入了isShown 判断用户可见性。
- isShown 作为判断之后,大部分手机功能都是正常的。 vivo全面屏 手机突然出现一种情况,解锁屏幕亮之后userPresent 函数调用,视频开始播放,但实际上手机上面锁屏页面并未移除,视频对于用户依然不可见,isShown 这里返回true。 所以这里我加入了 锁屏页面是否盖在上面来解决这个问题,确保万无一失,亲测公司所有手机都体验正常。
判断屏幕是否时候解锁。
private boolean screenOff() {
KeyguardManager mKeyguardManager = (KeyguardManager) getContext().getSystemService(KEYGUARD_SERVICE);
if (mKeyguardManager.inKeyguardRestrictedInputMode()) {
// keyguard on
Log.d(TAG, "mKeyguardManager on ");
return true;
}
return false;
}
网友评论