Android 音視頻 趕上鎖屏那些事

說明

最近作直播播放,內核用的是騰訊超級播放器。屏幕鎖屏與打開時候遇到一些問題這裏進行陳述...爲了提高播放體驗,咱們老是 但願鎖屏暫停 開屏繼續播放的效果。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

  1. 對於華爲mate 9和小米8手機,發現鎖屏按鍵以後只是黑屏並不鎖屏,會遇到直播沒法播放狀況, 只會調用onScreenOn 函數。因此onScreenOn 和 userPresent 應該用一樣的播放邏輯。
  2. 大部分手機鎖屏按鍵解鎖顯示以後會調用 userPresent ,可是假如此刻處於相似微信分享界面而沒有分享,這時鎖屏開屏視頻會播放可是實際上視頻播放頁面對於用戶是不可見的。 因此加入了isShown 判斷用戶可見性。
  3. isShown 做爲判斷以後,大部分手機功能都是正常的。 vivo全面屏 手機忽然出現一種狀況,解鎖屏幕亮以後userPresent 函數調用,視頻開始播放,但實際上手機上面鎖屏頁面並未移除,視頻對於用戶依然不可見,isShown 這裏返回true。 因此這裏我加入了 鎖屏頁面是否蓋在上面來解決這個問題,確保萬無一失,親測公司全部手機都體驗正常。

判斷屏幕是否時候解鎖。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;
    }
複製代碼
相關文章
相關標籤/搜索