文档章节

Android 6.0 悬浮窗默认关闭解决方案

fuchenxuan
 fuchenxuan
发布于 2016/05/23 22:26
字数 679
阅读 43
收藏 0

#Android 6.0 悬浮窗默认关闭解决方案

前言

在谷歌往Android中加入悬浮窗口功能时就表示希望开发者只用其来做用户通知,修改的悬浮窗功能潜在一定的安全隐患,不过手机厂商可不这么认为,于是本来被用于通知的悬浮窗被改成了其他的功能。我们都知道Android 6.0中,系统新增应用授权机制,还默认禁用了“浮动窗口”权限,所以悬浮窗功能只能当作通知使用。
  

直接上错误异常信息

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@60838a -- 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 android.app.Dialog.show(Dialog.java:319)
        ....

一、遇到问题

  1. Android 6.0 使用悬浮窗崩溃问题 (permission denied for this window type)
  2. 当你使用targetSdkVersion=22 ,而且添加了
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />权限,正常可以使用悬浮窗,然后修改targetSdkVersion=23,重新编译后依然能使用,也就是说只要一次授权了 就不在检测悬浮窗权限了。这是遇到的坑需要注意,卸载重装就好了

二、解决方案

  1. 使用TYPE_TOAST
    getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
    优点: 不需要权限,都能显示
    缺点: API level<19 的机器(MIUI除外),要有 android.permission.SYSTEM_ALERT_WINDOW权限并且将 type 设置为 WindowManager.LayoutParams.TYPE_PHONE 或者WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 可以显示但没有交互

为什么TYPE_TOAST就不要权限呢?查看Android源码

public int checkAddPermission(WindowManager.LayoutParams attrs) {
    int type = attrs.type;

    if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
            || type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {
        return WindowManagerImpl.ADD_OKAY;
    }
    String permission = null;
    switch (type) {
        case TYPE_TOAST:
            // XXX right now the app process has complete control over
            // this... should introduce a token to let the system
            // monitor/control what they are doing.
            break;
        case TYPE_INPUT_METHOD:
        case TYPE_WALLPAPER:
            // The window manager will check these.
            break;
        case TYPE_PHONE:
        case TYPE_PRIORITY_PHONE:
        case TYPE_SYSTEM_ALERT:
        case TYPE_SYSTEM_ERROR:
        case TYPE_SYSTEM_OVERLAY:
            permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;
            break;
        default:
            permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
    }
    if (permission != null) {
        if (mContext.checkCallingOrSelfPermission(permission)
                != PackageManager.PERMISSION_GRANTED) {
            return WindowManagerImpl.ADD_PERMISSION_DENIED;
        }
    }
    return WindowManagerImpl.ADD_OKAY;
}

这个方法是往系统的WindowManager里addView的时候做权限检查用的,除了TYPE_TOAST外,其他的都需要添加权限 。
2. 先进行权限检测,引导用户开启

private static final int REQUEST_CODE = 1;
private  void requestAlertWindowPermission() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            Log.i(LOGTAG, "onActivityResult success");
        }
    }
}        

手动设置方式
(Android 6.0+:设置——应用——右上角齿轮——「在其他应用的上层显示」)
3. 更改targetSDKVersion=22后,将被继续使用旧有规则,用户在安装的时候不得不接受所有权限,安装后app就有了那些权限,在Manifest里添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />权限 也能正常使用了。

如果想了解更详细可以参考
* http://www.liaohuqiu.net/cn/posts/android-windows-manager/

本人水平有限, 如有错误, 欢迎指正, 以免误导他人

© 著作权归作者所有

fuchenxuan
粉丝 10
博文 29
码字总数 52850
作品 0
南昌
私信 提问
Andorid 应用内悬浮控件实践方案总结

本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。 在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 这里写图片描述 首先想到的是申请悬浮窗权限,OK~ 打...

王英豪
2017/11/16
0
0
Android 悬浮窗、悬浮球开发

1、权限管理 直接看我另外一篇博客吧,传送门: https://my.oschina.net/u/1462828/blog/1933162 2、Base类BaseSuspend 还有里面用到的一个size类: 3、定制视图和使用 要实现的逻辑是,显示...

她叫我小渝
2018/08/24
869
0
请教android开发的问题

最近我想实现悬浮图标点击返回主程序的功能。 具体的实现方法是在主程序中的Switch被开启的时候 开启一个Service,通过Service建立一个float窗口,这个窗口我就用一个小图片显示,这样就做成...

Bllose
2014/03/10
204
4
Android开发利器之ActivityTracker

版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracker 今天在群里面划水,有个小伙伴问到一个问题,”...

xing_star
06/02
0
0
【乐点】百度搜索SDK开发者文档

下载SDK,将lerdian_SDK.jar包放到工程目录libs目录下; 请将下面权限配置代码复制到 AndroidManifest.xml 文件中 : 同时在AndroidManifest.xml文件中配置以下信息(注:这两个内容必须添加在...

乐点
2015/08/11
819
1

没有更多内容

加载失败,请刷新页面

加载更多

实战项目-学成在线(一)

之前看的黑马程序员实战项目之一,打算以博客的形式写出来,也让自己重新温习一下。 1、项目背景 略(就是当前这东西很火,我们重点在开发,这些就略过) 2、功能模块 门户,学习中心,教学管...

lianbang_W
18分钟前
1
0
基于Vue的数字输入框组件开发

本文转载于:专业的前端网站➫基于Vue的数字输入框组件开发 1、概述 Vue组件开发的API:props、events和slots 2、组件代码 github地址:https://github.com/MengFangui/VueInputNumber 效果:...

前端老手
26分钟前
2
0
百度地图根据经纬度获取运动轨迹

<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=n......

泉天下
28分钟前
4
0
学习记录(day04-axios增删改查、v-for循环、页面加载成功处理函数)

[TOC] 1.1 基本语法:插值表达式 <template> <div> {{username}} <br/> {{1+2+3}} <br/> {{'你的名字是:' + username}} <br/> {{'abc'.split('')}} </div><......

庭前云落
今天
3
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部