安卓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具体实现方法比较简单大家可以自行实现。

你可能感兴趣的:(项目积累)