android开发中悬浮窗被禁用,无权限开启悬浮窗的解决方案
首先,感谢这两篇博文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开发中悬浮窗被禁用,无权限开启悬浮窗的解决方案相关推荐
- android开发中遇到的问题汇总
android开发中遇到的问题汇总(五),android汇总127.ANDROID仿IOS时间_ANDROID仿IOS弹出提示框 http://dwtedx.com/itshare_297.html1 ...
- 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程
前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...
- 在android开发中使用multdex的方法-IT蓝豹为你整理
在android开发中使用multdex的方法-IT蓝豹为你整理 Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个, ...
- android权限--android开发中的权限及含义(下)
android权限--android开发中的权限及含义(下) android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权 ...
- android中的mvp模式怎么定义,详解MVP模式在Android开发中的应用
一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Mode ...
- android最佳开发实现_在android开发中使用可访问性最佳做法
android最佳开发实现 As you know, accessibility is about building products that everyone can use easily and ...
- 浅谈Android开发中的NFC功能
目录 1."NFC"的自我描述 1.1 NFC功能的基本概念 1.2 NFC功能的背景.特性及发展趋势 2.NFC的基础知识.基本原理 2.1 NFC的工作模式 2.2 实现NFC ...
- Android开发中应避免的重大错误
by Varun Barad 由Varun Barad Android开发中应避免的重大错误 (Critical mistakes to avoid in Android development) A ...
- android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧
我们开发项目的时候,经常会看到禁止的情况,而Android开发中并没有直接调用的接口,下面是爱站技术频道小编就给大家介绍的Android开发中禁止下拉式的实现技巧,希望网友们喜欢! 分享给大家供大家参 ...
最新文章
- CentOS7下配置bacula-web
- Keras + Windows +Anaconda2-4.2.0 深度学习框架快速搭建
- Head First JSP---随笔九(Web应用安全)
- 抓取扑克之星免费赛玩家排行榜
- 使用DOM4J读取和维护XML数据
- 编码服务正在步入云端
- express路由管理的几种自动化方法分享-js教程-PHP中文网
- 字幕小工具 SubTool Released
- oracle 命令日志输出,ORACLE常用命令日志
- 适用于Java开发人员的Groovy吗? 认识Gradle,Grails和Spock
- Maven的maven-clean-plugin插件详解
- java城市级联一次查询_我的城市没有任何设计活动,所以我自己组织了一次。...
- 由Docker的MySQL官方镜像配置的容器无法启动问题解决办法(修改配置后无法启动)
- 我就想加个索引,怎么就这么难?
- 动态生成的html元素无法调用js函数,在调用js函数之前,如何确保将动态生成的div加载到DOM中?...
- 蓝桥杯小结,下阶段规划
- SAP ABAP第一,两,三代出口型BADI实现 解释的概念
- [7]2019-ICDM-Learning to Sample:an Active Learning Framework 论文笔记
- 在matlab中产生dsp程序学习
- 老男孩python14期全套-老男孩python14期