首先,感谢这两篇博文http://blog.csdn.net/cankingapp/article/details/51569576
http://blog.csdn.net/cool_fuwei/article/details/53070232
了解知识:
1.首先要知道6.0版本权限模型跟原来版本是不同的,不再是统一在manifest中默认系统授权,而是有需要的时候,向系统请求授权,提高用户体验。
2.了解权限检测流程,一点注意点是如果系统权限弹窗提示框被不再提醒了,需要我们自定义提示弹窗,引导用户去授权。
3.明白权限类型,分为normal和dangerous类型,同时,在dangerous中还需要注意一点,SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS这两个特殊授权请求方式,跟一般授权请求方式不同。
4.在判断APP是否运行在Android M上,可以用版本号来判断,可以准确点。

问题一:在安卓开发中处理悬浮窗权限时,发现魅族和小米手机无论android4.4.4、android5.1.1还是android6.0,权限manifest中:android.permission.SYSTEM_ALERT_WINDOW权限也加过了,就是弹不起。这个权限也不是android 6.0中的敏感权限,所以android 6.0动态申请权限也是行不通的,这个问题很难通过diamante打开悬浮窗,没辙之后想到,调用应用的设置界面引导用户去手动的打开。

问题二:在三星6.0或android6.0及android 6.0以上的手机(小米和魅族处理方式另外处理同上),未处理弹窗问题可能会引发以下问题,

android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@a299900 -- permission denied for this window typeat android.view.ViewRootImpl.setView(ViewRootImpl.java:879)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:337)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)at android.app.Dialog.show(Dialog.java:350)

话不多说,直接上代码处理以上两个疑问。

 @Overridepublic void onClick(View view) {String user = edit_user.getText().toString();String pwd = edit_pwd.getText().toString();if (user.equals("123") && pwd.equals("123")) {editor = pref.edit();editor.putString("user", user);editor.putString("pwd", pwd);editor.commit();//开启悬浮窗前先请求权限if ("Xiaomi".equals(Build.MANUFACTURER)) {//小米手机LogUtil.E("小米手机");requestPermission();} else if ("Meizu".equals(Build.MANUFACTURER)) {//魅族手机LogUtil.E("魅族手机");requestPermission();} else {//其他手机LogUtil.E("其他手机");if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);startActivityForResult(intent, 12);} else {switchActivity();}} else {switchActivity();}}} else {ToastUtil.show(this, "这么简单都出错,脑子呢?");}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 11) {if (isFloatWindowOpAllowed(this)) {//已经开启switchActivity();} else {ToastUtil.show(this, "开启悬浮窗失败");}} else if (requestCode == 12) {if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(LoginActivity.this)) {ToastUtil.show(this, "权限授予失败,无法开启悬浮窗");} else {switchActivity();}}}}/*** 跳转Activity*/private void switchActivity() {startActivity(new Intent(LoginActivity.this, Main2Activity.class));ToastUtil.show(LoginActivity.this, "吆,竟然蒙对了!");finish();}/*** 判断悬浮窗权限** @param context* @return*/@TargetApi(Build.VERSION_CODES.KITKAT)public static boolean isFloatWindowOpAllowed(Context context) {final int version = Build.VERSION.SDK_INT;if (version >= 19) {return checkOp(context, 24);  // AppOpsManager.OP_SYSTEM_ALERT_WINDOW} else {if ((context.getApplicationInfo().flags & 1 << 27) == 1 << 27) {return true;} else {return false;}}}@TargetApi(Build.VERSION_CODES.KITKAT)public static boolean checkOp(Context context, int op) {final int version = Build.VERSION.SDK_INT;if (version >= 19) {AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);try {Class<?> spClazz = Class.forName(manager.getClass().getName());Method method = manager.getClass().getDeclaredMethod("checkOp", int.class, int.class, String.class);int property = (Integer) method.invoke(manager, op,Binder.getCallingUid(), context.getPackageName());Log.e("399", " property: " + property);if (AppOpsManager.MODE_ALLOWED == property) {return true;} else {return false;}} catch (Exception e) {e.printStackTrace();}} else {Log.e("399", "Below API 19 cannot invoke!");}return false;}/*** 请求用户给予悬浮窗的权限*/public void requestPermission() {if (isFloatWindowOpAllowed(this)) {//已经开启switchActivity();} else {openSetting();}}/*** 打开权限设置界面*/public void openSetting() {try {Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");localIntent.putExtra("extra_pkgname", getPackageName());startActivityForResult(localIntent, 11);LogUtil.E("启动小米悬浮窗设置界面");} catch (ActivityNotFoundException localActivityNotFoundException) {Intent intent1 = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getPackageName(), null);intent1.setData(uri);startActivityForResult(intent1, 11);LogUtil.E("启动悬浮窗界面");}}

android开发中悬浮窗被禁用,无权限开启悬浮窗的解决方案相关推荐

  1. android开发中遇到的问题汇总

    android开发中遇到的问题汇总(五),android汇总127.ANDROID仿IOS时间_ANDROID仿IOS弹出提示框 http://dwtedx.com/itshare_297.html1 ...

  2. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

  3. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

  4. 在android开发中使用multdex的方法-IT蓝豹为你整理

    在android开发中使用multdex的方法-IT蓝豹为你整理 Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个, ...

  5. android权限--android开发中的权限及含义(下)

    android权限--android开发中的权限及含义(下) android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权 ...

  6. android中的mvp模式怎么定义,详解MVP模式在Android开发中的应用

    一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Mode ...

  7. android最佳开发实现_在android开发中使用可访问性最佳做法

    android最佳开发实现 As you know, accessibility is about building products that everyone can use easily and ...

  8. 浅谈Android开发中的NFC功能

    目录 1."NFC"的自我描述 1.1 NFC功能的基本概念 1.2 NFC功能的背景.特性及发展趋势 2.NFC的基础知识.基本原理 2.1 NFC的工作模式 2.2 实现NFC ...

  9. Android开发中应避免的重大错误

    by Varun Barad 由Varun Barad Android开发中应避免的重大错误 (Critical mistakes to avoid in Android development) A ...

  10. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧

    我们开发项目的时候,经常会看到禁止的情况,而Android开发中并没有直接调用的接口,下面是爱站技术频道小编就给大家介绍的Android开发中禁止下拉式的实现技巧,希望网友们喜欢! 分享给大家供大家参 ...

最新文章

  1. CentOS7下配置bacula-web
  2. Keras + Windows +Anaconda2-4.2.0 深度学习框架快速搭建
  3. Head First JSP---随笔九(Web应用安全)
  4. 抓取扑克之星免费赛玩家排行榜
  5. 使用DOM4J读取和维护XML数据
  6. 编码服务正在步入云端
  7. express路由管理的几种自动化方法分享-js教程-PHP中文网
  8. 字幕小工具 SubTool Released
  9. oracle 命令日志输出,ORACLE常用命令日志
  10. 适用于Java开发人员的Groovy吗? 认识Gradle,Grails和Spock
  11. Maven的maven-clean-plugin插件详解
  12. java城市级联一次查询_我的城市没有任何设计活动,所以我自己组织了一次。...
  13. 由Docker的MySQL官方镜像配置的容器无法启动问题解决办法(修改配置后无法启动)
  14. 我就想加个索引,怎么就这么难?
  15. 动态生成的html元素无法调用js函数,在调用js函数之前,如何确保将动态生成的div加载到DOM中?...
  16. 蓝桥杯小结,下阶段规划
  17. SAP ABAP第一,两,三代出口型BADI实现 解释的概念
  18. [7]2019-ICDM-Learning to Sample:an Active Learning Framework 论文笔记
  19. 在matlab中产生dsp程序学习
  20. 老男孩python14期全套-老男孩python14期

热门文章

  1. 通信原理(一) 通信原理概述
  2. graphx项目实战 — 航班飞行网图分析
  3. Shopee 店铺如何运营?运营思路心得分享
  4. xilinx基础篇Ⅰ(7)ISE14.7开发基础流程 [CPLD章节]
  5. 数据库系统概论第五版(笔记)
  6. web前端期末大作业实例 (1500套) 集合
  7. 初学者的SDN学习之路
  8. kml文件怎么用arcgis打开_ArcGIS学习记录—KMZ KML与SHP文件互相转换
  9. 第三章 3.2 DI依赖循环 --《跟我学Spring》笔记 张开涛
  10. Java函数、参数及传参方式详解