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,也是需要增加判断的。


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

相关文章
|
1月前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
29天前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
17天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
18天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
80 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
66 16
|
24天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
1月前
|
算法 JavaScript Android开发
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
100 2
|
2月前
|
安全 搜索推荐 Android开发
深入探索安卓与iOS系统的差异及其对用户体验的影响
在当今的智能手机市场中,安卓和iOS是两大主流操作系统。它们各自拥有独特的特性和优势,为用户提供了不同的使用体验。本文将深入探讨安卓与iOS系统之间的主要差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面,并分析这些差异如何影响用户的使用体验。