关于悬浮球(悬浮窗)Android8.0(Android O)的适配
最近项目新需求要用到悬浮球技术,因以前的工作项目中就用到了这个技术,因此看到这个需求时心里是愉悦的,心念着照搬过来即可。开发中也确实如此,直接搬过来,然后测试了三星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)的适配相关推荐
- 悬浮球 / 悬浮按钮 / 辅助按钮
原文链接:https://github.com/jinht/FloatingBall 类似于 iOS 系统自带的 AssistiveTouch / 京东 / 聚划算 / 建行等的辅助按钮 -- 由an ...
- android8.0/android O 新特性
Android O 行为变更 Android O 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 其中大部分变更会影响 ...
- Android关于虚拟控件、全面屏及悬浮球机型适配时遇到的问题
现在市面上全面屏的手机,有些机型存在悬浮球的设置.在界面设计的时候就要考虑如全面屏/虚拟键/悬浮球三种情形的关于控件适配的问题.当遇到一些视频显示及图片显示时,全面屏/虚拟控件/悬浮球状态时会对控件进 ...
- android实现全局悬浮球
android实现悬浮球功能: 设置悬浮球View操作代码: package lwnewoa.zjsos.com.floadballdemo;import android.content.Contex ...
- 自定义悬浮球,提供一些快捷操作。比如一键静音,一键锁频,一键截屏,一键回桌面,手电筒等
FloatingBall 项目地址:killer8000/FloatingBall 简介:自定义悬浮球,提供一些快捷操作.比如一键静音,一键锁频,一键截屏,一键回桌面,手电筒等 更多:作者 提 ...
- html防微信音乐,web高仿樊登H5/微信音乐播放悬浮球效果
这两天完成了一个仿樊登 H5 的音乐播放悬浮球效果,这个效果跟微信音乐播放悬浮球的效果也很相似,今天总结一下实现的思路过程(基于 Vue 实现). 先来看看樊登 H5 的效果. 再来看看我的实现,挺完 ...
- Vue实现仿iPhone悬浮球
Vue实现仿iPhone悬浮球 悬浮球插件简单的效果图: 很遗憾,没找到太好的视频转gif的软件,压缩出来的大小超过了限制,就不放图了 可以参考其他人的图,效果一致: 简单实用案例: <!-- ...
- 小米手机如何关闭悬浮球
小米手机如何关闭悬浮球悬浮球呢? 设置->更多设置->悬浮球:这里就可以选择啦- 虽然不是什么比较难的事情.不过,每一次都花费比较多的时间来寻找,这里就简单的记录一下吧. 好习惯记录下来就 ...
- 荣耀6如何升级android版本号,华为及荣耀可以升级Android8.0手机型号汇总,及其他机型升级预报...
原标题:华为及荣耀可以升级Android8.0手机型号汇总,及其他机型升级预报 为满足各系列手机花粉升级到基于安卓Android8.0(奥利奥)适配的华为EMUI8系统的强烈愿望,华为EMUI官方加快 ...
最新文章
- MindSpore 高阶优化器
- bzoj 2157 旅行
- 局域网ip地址不够用怎么解决?
- Vue+Openlayers+Draw实现画笔切换功能,切换画笔为点、线、面
- Unet项目解析(3): run_testing.py
- Event/window.Event属性和方法
- SAP Leonardo平台机器学习API的一些错误处理机制
- linux下node-sass安装失败
- 美团客户端响应式框架 EasyReact 开源啦
- ros创建工作空间_ROS 初级 - 安装和配置 ROS 环境
- F#基础教程 ref类型
- jquery chosen插件的使用(搜索查询下拉列表,多选)
- 爬虫日记(71):用OCR来对抗字体反爬
- java visio_Visio画UML类图、序列图 for Java
- Word批量打印软件/工具
- VBScript经典教程以及函数手册
- SQL——汇总分组排序
- JavaWeb学习阶段一MySQL数据库三(数据库设计:一对一、一对多、多对多的关系设计和案例)
- Banner打造广告自动轮播图
- PHP经典实例读书笔记--变量
热门文章
- 无线网络两台计算机如何共享打印机,打印机共享:如何实现多台电脑控制共用一台打印机(二无线篇)...
- Verilog实现Nand Flash Ecc校验和纠错
- java解决udp可靠性,由于UDP协议提供的是不可靠的服务,因此,可以被淘汰掉。...
- 2. 高光谱成像技术
- Linux操作系统网络驱动程序编写
- 房卡麻将分析之一键入局
- PHP学习之路(一)——初学PHP
- 七个人生工具SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则——送给自己
- php制作医院预约电子就诊卡
- 前端10个灵魂拷问 吃透这些你就能摆脱初级前端工程师!