转自:http://blog.csdn.net/tangmanong/article/details/53114758
Android的窗口体系中,WindowManager占有非常重要的地位,平时我们使用悬浮窗会遇到一些权限的问题。
当 Android工程在
targetSdkVersion 23
编译,Android6.0及其以上版本手机使用悬浮窗功能时候,会发生
Java.lang.RuntimeException: Unable to create service com.fb.tangyc.fbtools.service.FBService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@123e0ab -- permission denied for this window type
的异常,导致程序崩溃。
当Android工程在
targetSdkVersion 22
编译,Android6.0及其以上版本手机使用悬浮窗功能会正常使用
其实原因很简单,大部分的Android6.0手机(尤其是三星,谷歌原生手机)
在大于等于23版本下编译,悬浮窗权限默认是关闭没有权限,然在小于23版本下编译悬浮窗权限是开启有权限的。
所以在大于23版本下编译时需要去检测悬浮窗权限,并且获取悬浮窗权限,下面我就罗列下怎么去检测悬浮窗权限并且获取悬浮窗权限
if(Build.VERSION.SDK_INT>=23)
{
if(Settings.canDrawOverlays(this))
{
//有悬浮窗权限开启服务绑定 绑定权限
Intent intent = new Intent(MainActivity.this, FBService.class);
startService(intent);
}else{
//没有悬浮窗权限m,去开启悬浮窗权限
try{
Intent intent=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
}catch (Exception e)
{
e.printStackTrace();
}
}
} else{
//默认有悬浮窗权限 但是 华为, 小米,oppo等手机会有自己的一套Android6.0以下 会有自己的一套悬浮窗权限管理 也需要做适配
Intent intent = new Intent(MainActivity.this, FBService.class);
startService(intent);
}
每次使用悬浮窗的时候都要去检测权限,因为悬浮窗权限是可以手动关闭的。
位置位于 (三星S6为例Android6.0.1版本)设置-- 应用程序--应用程序管理器 -- 更多 --可出现在顶部的应用程序 --- 选择你的APP -- 运行在其他应用的上层显示