Android 6.0“棉花糖”默认禁用悬浮窗口——解决方案

来源:互联网 发布:java中的多态 编辑:程序博客网 时间:2024/05/16 18:38

Android 6.0“棉花糖”默认禁用悬浮窗口——解决方案

众所周知,google一开始并没有将悬浮窗口作为一个交互工具,而是希望`android.permission.SYSTEM_ALERT_WINDOW`能够老老实实地拿来做用户通知。所以在Android 6.0 Marshmallow(棉花糖)中,系统引入了新的应用授权系统,以确保用户能够对应用的权限进行逐项审核。因此我们在应用程序中并不能按照之前的方式添加权限,否则报错:
java.lang.RuntimeException: Unable to start receiver com.ygkey.www.floatingwindow.IntentReceiver: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@d38bb2f -- permission denied for this window type            at android.app.ActivityThread.handleReceiver(ActivityThread.java:2732)            at android.app.ActivityThread.-wrap14(ActivityThread.java)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:148)            at android.app.ActivityThread.main(ActivityThread.java:5417)            at java.lang.reflect.Method.invoke(Native Method)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)     Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@d38bb2f -- permission denied for this window type            at android.view.ViewRootImpl.setView(ViewRootImpl.java:591)            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)            at com.ygkey.www.floatingwindow.MyWindowManager.createFloatView(MyWindowManager.java:129)            at com.ygkey.www.floatingwindow.IntentReceiver.onReceive(IntentReceiver.java:13)            at android.app.ActivityThread.handleReceiver(ActivityThread.java:2725)            at android.app.ActivityThread.-wrap14(ActivityThread.java)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:148)            at android.app.ActivityThread.main(ActivityThread.java:5417)            at java.lang.reflect.Method.invoke(Native Method)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
因此,在进行弹出悬浮窗之前,可以做判断:
if (!Settings.canDrawOverlays(MainActivity.this)) {//判断android 6.0中是否开启权限      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,      Uri.parse("package:" + getPackageName()));      //跳转到权限设置页面      startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);     } else {      Intent intent = new Intent(MainActivity.this, FloatWindowService.class);      startService(intent);      finish();}
之后,在权限设置后再次进行判断:
    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {            if (!Settings.canDrawOverlays(this)) {                // SYSTEM_ALERT_WINDOW permission not granted...            }        }    }
这样,就能够让用户主动选择是否开启权限了。初次写博客,本意分享,如果大家有了更好的解决方法,欢迎和我联系。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃错东西呕吐怎么办 手腕筋扭伤了怎么办 右膝盖内侧疼痛怎么办 膝盖关节腔积液怎么办 小孩玩游戏花钱怎么办 初三玩手机上瘾怎么办 无线网有感叹号怎么办 台式电脑网络感叹号怎么办 忘记发红包密码怎么办 电信诈骗被骗后怎么办 C小孩讨厌上学怎么办 军训来大姨妈怎么办 夏天军训来月经怎么办 军训遇到大姨妈怎么办 长春市图书馆读者证怎么办 济宁图书馆怎么办读者卡 海南省图书馆读者证怎么办 小孩子特别能吃怎么办 小孩吃不下去药怎么办 小孩不肯去上学怎么办 初中没有团员证怎么办 入团申请书丢了怎么办 刚成立单位社保怎么办 老年人耳鸣怎么办小妙招 老人血压高200怎么办 老人晕车后难受怎么办 老人头晕心里慌怎么办 老人憋的慌怎么办 老人厌食没胃口怎么办 老年人心里整天疑心病怎么办 一个人疑心太重怎么办 我疑心病很重怎么办 老人疑心病太重怎么办 心理有问题该怎么办 老人得了妄想病怎么办 小学生没做作业怎么办 孩子完不成作业怎么办 敏感多疑怎么办很痛苦 老年人脾气越来越古怪怎么办 村委会不给盖章怎么办 普通发票超过3万怎么办