Android 8.0 悬浮窗变动与对应使用方法

在Android 8.0上,悬浮窗功能遇到了兼容性问题,需要根据官方文档进行调整。针对Android 8.0及以上版本,开发者需要在AndroidManifest.xml中添加权限,并在API 23以上进行运行时权限请求,以确保悬浮窗正常工作。
摘要由CSDN通过智能技术生成

-- By Zhongxiang.huang


问题描述:

    项目开发中有使用到了悬浮窗,近期在往Android O 系统porting,发现悬浮窗功能不能正常使用,运行出错:

  android.view.WindowManager$BadTokenException: Unable to add window — token android.os.BinderProxy@447a6748 is not valid; is your activity running?

或者

  android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootlmpl$W@40ec8528 -- permission denied for this window

 

解决方案:

    Android 8.0 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。其中有些是针对Android 8.0 的应用。官方文档描述如下。

 

这些行为变更专门应用于针对 O 平台或更高平台版本的应用。针对 Android8.0 或更高平台版本进行编译,或将 targetSdkVersion设为 Android 8.0 或更高版本的应用开发者必须修改其应用以正确支持这些行为(如果适用)。
    提醒窗口
    使用SYSTEM_ALERT_WINDOW 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口:
    •TYPE_PHONE
    •TYPE_PRIORITY_PHONE
    •TYPE_SYSTEM_ALERT
    •TYPE_SYSTEM_OVERLAY
    •TYPE_SYSTEM_ERROR
    相反,应用必须使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型。
    使用TYPE_APPLICATION_OVERLAY 窗口类型显示应用的提醒窗口时,请记住新窗口类型的以下特性:
    •应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面。
    •系统可以移动使用 TYPE_APPLICATION_OVERLAY窗口类型的窗口或调整其大小,以改善屏幕显示效果。
    •通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。
    ……

 

因此,针对 Android 8.0 或更高平台版本进行编译,或将 targetSdkVersion 设为 Android 8.0 或更高版本的应用开发是,只要区别设置即可。

……
if (Build.VERSION.SDK_INT>=26) {
  //8.0新特性
     mWindowParams.type= WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}else{
  
     mWindowParams.type= WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
……

 

另外还需要注意权限问题:

如果是在Android4.x的情况,只用在AndroidManifest.xml中添加权限:

<!-- 显示系统窗口权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 在 屏幕最顶部显示addview-->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

 如果是在Android6(API 23)以上,则还需添加以下代码进行请求权限:

//权限判断
if (Build.VERSION.SDK_INT >= 23) {
   
    if(!Settings.canDrawOverlays(getApplicationContext())) {
   
        //启动Activity让用户授权
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
        startActivity(intent);
        return;
    } else {
   
        //执行6.0以上绘制代码
    }
} else {
   
    //执行6.0以下绘制代码、
}

或者:

//权限判断
if (Build.VERSION.SDK_INT >= 23) {
   
    if(!Settings.canDrawOverlays(getApplicationContext())) {
   
        //启动Activity让用户授权
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值