天天看點

安卓6.0關于懸浮窗導緻"檢測到螢幕疊加層"的開發端解決方案

安卓6.0以後當彈出權限授權框時,考慮到安全問題,如果螢幕上存在懸浮窗,會出現”檢測到螢幕疊加層”的提示,導緻不能正常授予權限。

最簡單的解決方案就是手動關閉懸浮窗了,不過這樣的使用者體驗當然是很糟糕的,今天要介紹的方法是在彈出授權框時自動隐藏懸浮窗,授權框消失後再恢複懸浮窗。

解決思路:如果能檢測授權框彈出界面,就可以順利解決問題,當然系統沒有給開發者預留彈出授權框的接口,需要自己去檢測界面的變化,因為是全局檢測,是以自然就想到了輔助功能AccessibilityService了,可以在檢測到視窗狀态變化時,判斷窗體所屬的包名不是授權框所屬包名”com.android.packageinstaller”,如果是則隐藏懸浮窗,如果不是則恢複懸浮窗的顯示。

public void onAccessibilityEvent(final AccessibilityEvent accessibilityEvent) {

    if(accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){

        String foregroundPackageName = accessibilityEvent.getPackageName().toString();

        if("com.android.packageinstaller".equals(foregroundPackageName)){
        //進入授權界面,隐藏懸浮窗
}else{
        //退出授權界面,恢複懸浮窗
}
}
           

當然也可以監聽授權框所屬activity的變化,授權框activity包名為com.android.packageinstaller.permission.ui.GrantPermissionsActivity,可以監聽onCreate()和finish()隐藏和顯示懸浮窗,可以通過Xposed架構hook這兩個方法實作,Xposed具體實作方法比較簡單大家可以自行實作。