android 7.1悬浮窗系统权限问题

简介: 转载请标明出处: http://blog.csdn.net/DJY1992/article/details/77942568 本文出自:【奥特曼超人的博客】很多人问小米系统是不是需要单独处理授权问题,其实授权问题都是类似的,在Android 5.0之后系统权限要求越来越严格,当然,5.0系统bug比较多,兼容性不太好,所以出来没多久就直接问世了,在Android 6.0之后才趋于平稳,系统更新也比较快,权限问题也是我们必须处理的一个问题,还有一点,就是7.0之后的某些版本使用吐司Toast会引起crash。

转载请标明出处:
http://blog.csdn.net/DJY1992/article/details/77942568
本文出自:【奥特曼超人的博客】

很多人问小米系统是不是需要单独处理授权问题,其实授权问题都是类似的,在Android 5.0之后系统权限要求越来越严格,当然,5.0系统bug比较多,兼容性不太好,所以出来没多久就直接问世了,在Android 6.0之后才趋于平稳,系统更新也比较快,权限问题也是我们必须处理的一个问题,还有一点,就是7.0之后的某些版本使用吐司Toast会引起crash。

我们来看下权限的流程

  • 弹出对话框询问
  • 成功则进入
  • 失败进入询问
  • 失败则“设置”
  • 拒绝不处理

SDK里所带的悬浮窗功能所需权限是WindowManager,在android官网可以看到7.0之后更新的相关内容, 如果想查看android 7.0 之后权限存储有什么不同的可以看这篇文章《Android 7.0之访问文件的权限和FileProvider类》,包括申请悬浮窗的权限问题。

如果拒绝权限则会出现以下异常:

可以看到报了Unable to add windowpermission denied for this window type

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@8d2524d -- permission denied for this window type
       at android.app.ActivityThread.handleCreateService(ActivityThread.java:2887)
       at android.app.ActivityThread.-wrap4(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
       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(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

所以我们xml配置文件记得要把权限配置上,在Android 7.0之前都是可以正常使用的,包括7.0的系统,但是如果在7.1.1没有进行特别处理的话是会出现如下错误:

可以看到报了Unable to add windowhas already been added

android.view.WindowManager$BadTokenException: Unable to add window -- window android.view.ViewRootImpl$W@326f7b2 has already been added
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:691)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
        at android.widget.Toast$TN.handleShow(Toast.java:434)
        at android.widget.Toast$TN$2.handleMessage(Toast.java:345)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

那是因为 WindowManagerGlobal 在 AddView 的时候会进行预处理 View,此处更新的标志位是TYPE_TOAST,在handle里面增加了TYPE_PHONE,所以我们在申请悬浮窗处理的时候也要增加判断,不然则会抛出异常。

其实很简单,在申请的时候增加下判断就可以了。

解决方法:

WindowManager.LayoutParams wmParamsDu = new WindowManager.LayoutParams();
windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT > 24) {
    wmParamsDu.type = WindowManager.LayoutParams.TYPE_PHONE;
} else {
    wmParamsDu.type = WindowManager.LayoutParams.TYPE_TOAST;
} 

申请权限可参考:

try {
            Class clazz = Settings.class;
            Field field = clazz.getDeclaredField(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            Intent intent = new Intent(field.get(null).toString());
            Log.i("FLAG_ACTIVITY_NEW_TASK","Karl-Dujinyang");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("package:" + context.getPackageName()));
            context.startActivity(intent);
        } catch (Exception e) {
            Log.e("Exception", "permission "+e.getMessage());
        }

注意:注意 WindowManagerGlobal 中的View,也包括Toast,所以如果在调用时用了Toast就会报错,会报同样的错误,Unable to add window -- windowhas already been added,吐司崩溃,如果想要使用Toast,也是需要增加判断的。


|| 版权声明:本文为博主杜锦阳原创文章,转载请注明出处。

相关文章
|
2月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
134 2
|
2月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
59 0
|
2月前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
60 0
|
3月前
|
搜索推荐 Android开发 iOS开发
探索安卓与iOS系统的用户界面设计哲学
现代移动操作系统的设计哲学不仅仅是技术的表现,更是用户体验与功能实现的结合。本文将深入分析安卓与iOS两大主流系统在用户界面设计方面的差异与共通之处,探讨它们背后的思维模式及其对用户体验的影响。 【7月更文挑战第11天】
72 3
|
15天前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。
|
15天前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
1月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
60 6
|
1月前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
1月前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
56 2
|
1月前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
140 1