最近项目新需求要用到悬浮球技术,因以前的工作项目中就用到了这个技术,因此看到这个需求时心里是愉悦的,心念着照搬过来即可。开发中也确实如此,直接搬过来,然后测试了三星C5,小米Note4以及OPPO手机,运行顺畅,均无异常。当测试到华为Honor8青春版时,就GG了。抛出了以下异常:

java.lang.RuntimeException: Unable to create service com.haoyue.notedemos.floatball.FloatServive: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@270feab --
******permission denied for window type 2002******at android.app.ActivityThread.handleCreateService(ActivityThread.java:3878)at android.app.ActivityThread.-wrap5(Unknown Source:0)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1989)at android.os.Handler.dispatchMessage(Handler.java:108)at android.os.Looper.loop(Looper.java:166)at android.app.ActivityThread.main(ActivityThread.java:7425)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)Caused by: android.view.WindowManager$BadTokenException: ******Unable to add window android.view.ViewRootImpl$W@270feab -- ******
******permission denied for window type 2002******at android.view.ViewRootImpl.setView(ViewRootImpl.java:908)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:372)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:128)at com.haoyue.notedemos.floatball.FloatServive.initFloatBall(FloatServive.java:64)at com.haoyue.notedemos.floatball.FloatServive.onCreate(FloatServive.java:34)at android.app.ActivityThread.handleCreateService(ActivityThread.java:3858)at android.app.ActivityThread.-wrap5(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1989) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7425) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

异常的重点在这里:Unable to add window android.view.ViewRootImpl$W@270feab –permission denied for window type 2002,大体上说就是需要Window type的权限。这就真GGJJ了,不是给了:
mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE的权限么?

工程中关于该部分的代码如下:

    mLayoutParams = new WindowManager.LayoutParams();mManager = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE);mLayout = (LinearLayout) LayoutInflater.from(getApplication()).inflate(R.layout.flaot_ball, null);mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;mLayoutParams.format = PixelFormat.RGBA_8888;mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;mLayoutParams.x = 100;mLayoutParams.y = 100;mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;mManager.addView(mLayout, mLayoutParams);

xml文件清单也配置了这两条权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

查询了很多资料,没几篇文章能够说清楚怎么回事,怎么解决。好吧,回到原点,排查该异常的原因。查来查去,除了发现华为honor青春版时8.0版本的系统外,就没有别的特别明显的不同了。难道是8.0版本的问题?

再次带着问题查询资料,不同的是目的性更强:Android8.0下的悬浮球。终于,找到了原因,有大神遇到相同的问题并解释清了抛该异常的原因:

在Android O之前的系统中申请了该权限后,再给对应的window设置:

mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE即可。

但是在Android O的系统中,除了在xml文件清单中配置权限外,google规定还要申请权限:.
mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
只有这样,悬浮窗才能显示出来。

所以,在授予权限时,要对手机的版本做如下判断:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}else {mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}

SDK版本在Android8.0(Android 0)以上,授予TYPE_APPLICATION_OVERLAY权限,在这之下的,授予TYPE_PHONE权限。不能为了省事,统一的授予TYPE_APPLICATION_OVERLAY,否则8.0之下的机型还是会继续报前面的错误。

关于悬浮球(悬浮窗)Android8.0(Android O)的适配相关推荐

  1. 悬浮球 / 悬浮按钮 / 辅助按钮

    原文链接:https://github.com/jinht/FloatingBall 类似于 iOS 系统自带的 AssistiveTouch / 京东 / 聚划算 / 建行等的辅助按钮 -- 由an ...

  2. android8.0/android O 新特性

    Android O 行为变更 Android O 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 其中大部分变更会影响 ...

  3. Android关于虚拟控件、全面屏及悬浮球机型适配时遇到的问题

    现在市面上全面屏的手机,有些机型存在悬浮球的设置.在界面设计的时候就要考虑如全面屏/虚拟键/悬浮球三种情形的关于控件适配的问题.当遇到一些视频显示及图片显示时,全面屏/虚拟控件/悬浮球状态时会对控件进 ...

  4. android实现全局悬浮球

    android实现悬浮球功能: 设置悬浮球View操作代码: package lwnewoa.zjsos.com.floadballdemo;import android.content.Contex ...

  5. 自定义悬浮球,提供一些快捷操作。比如一键静音,一键锁频,一键截屏,一键回桌面,手电筒等

    FloatingBall 项目地址:killer8000/FloatingBall  简介:自定义悬浮球,提供一些快捷操作.比如一键静音,一键锁频,一键截屏,一键回桌面,手电筒等 更多:作者   提 ...

  6. html防微信音乐,web高仿樊登H5/微信音乐播放悬浮球效果

    这两天完成了一个仿樊登 H5 的音乐播放悬浮球效果,这个效果跟微信音乐播放悬浮球的效果也很相似,今天总结一下实现的思路过程(基于 Vue 实现). 先来看看樊登 H5 的效果. 再来看看我的实现,挺完 ...

  7. Vue实现仿iPhone悬浮球

    Vue实现仿iPhone悬浮球 悬浮球插件简单的效果图: 很遗憾,没找到太好的视频转gif的软件,压缩出来的大小超过了限制,就不放图了 可以参考其他人的图,效果一致: 简单实用案例: <!-- ...

  8. 小米手机如何关闭悬浮球

    小米手机如何关闭悬浮球悬浮球呢? 设置->更多设置->悬浮球:这里就可以选择啦- 虽然不是什么比较难的事情.不过,每一次都花费比较多的时间来寻找,这里就简单的记录一下吧. 好习惯记录下来就 ...

  9. 荣耀6如何升级android版本号,华为及荣耀可以升级Android8.0手机型号汇总,及其他机型升级预报...

    原标题:华为及荣耀可以升级Android8.0手机型号汇总,及其他机型升级预报 为满足各系列手机花粉升级到基于安卓Android8.0(奥利奥)适配的华为EMUI8系统的强烈愿望,华为EMUI官方加快 ...

最新文章

  1. MindSpore 高阶优化器
  2. bzoj 2157 旅行
  3. 局域网ip地址不够用怎么解决?
  4. Vue+Openlayers+Draw实现画笔切换功能,切换画笔为点、线、面
  5. Unet项目解析(3): run_testing.py
  6. Event/window.Event属性和方法
  7. SAP Leonardo平台机器学习API的一些错误处理机制
  8. linux下node-sass安装失败
  9. 美团客户端响应式框架 EasyReact 开源啦
  10. ros创建工作空间_ROS 初级 - 安装和配置 ROS 环境
  11. F#基础教程 ref类型
  12. jquery chosen插件的使用(搜索查询下拉列表,多选)
  13. 爬虫日记(71):用OCR来对抗字体反爬
  14. java visio_Visio画UML类图、序列图 for Java
  15. Word批量打印软件/工具
  16. VBScript经典教程以及函数手册
  17. SQL——汇总分组排序
  18. JavaWeb学习阶段一MySQL数据库三(数据库设计:一对一、一对多、多对多的关系设计和案例)
  19. Banner打造广告自动轮播图
  20. PHP经典实例读书笔记--变量

热门文章

  1. 无线网络两台计算机如何共享打印机,打印机共享:如何实现多台电脑控制共用一台打印机(二无线篇)...
  2. Verilog实现Nand Flash Ecc校验和纠错
  3. java解决udp可靠性,由于UDP协议提供的是不可靠的服务,因此,可以被淘汰掉。...
  4. 2. 高光谱成像技术
  5. Linux操作系统网络驱动程序编写
  6. 房卡麻将分析之一键入局
  7. PHP学习之路(一)——初学PHP
  8. 七个人生工具SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则——送给自己
  9. php制作医院预约电子就诊卡
  10. 前端10个灵魂拷问 吃透这些你就能摆脱初级前端工程师!