android开发中悬浮窗被禁用,无权限开启悬浮窗的解决方案_xiao_ma123的专栏-CSDN博客首先,感谢这两篇博文http://blog.csdn.net/cankingapp/article/details/51569576 http://blog.csdn.net/cool_fuwei/article/details/53070232问题一:在安卓开发中处理悬浮窗权限时,发现魅族和小米手机无论android4.4.4、android5.1.1还是android6.0,权限manifeshttps://blog.csdn.net/siwujidan0125/article/details/53283876

是如果说有些情况下获取不到Activity对象,但是又想弹出Dialog呢?这时候用全局的Dialog是可以实现的。

只需要设置dialog为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT类型

然后添加android.permission.SYSTEM_ALERT_WINDOW权限

1
2
3
4
5
6
7
8
9
10
Dialog dialog = new AlertDialog.Builder(activity.getApplicationContext()).setTitle("野猿新一").setMessage("我是对话框内容啦").create();
// 增加这句代码
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();// 然后在manifest中添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
/*** 判断悬浮窗权限** @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(Context context) {if (!isFloatWindowOpAllowed(context)) {//已经开启openSetting(context);}
}/*** 打开权限设置界面*/
public void openSetting(Context context) {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", context.getPackageName());localIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(localIntent);ParachuteLog.d(TAG,"启动小米悬浮窗设置界面");} catch (ActivityNotFoundException localActivityNotFoundException) {Intent intent1 = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromParts("package", context.getPackageName(), null);intent1.setData(uri);context.startActivity(intent1);ParachuteLog.d(TAG,"启动悬浮窗界面");}Toast.makeText(context, "请开启应用显示悬浮窗权限!", Toast.LENGTH_SHORT).show();}public void showAgreement(Context context, AgreementDialog.AgreementCallback agreementCallback){if(context == null){return;}if(!(context instanceof Activity)) {if ("Xiaomi".equals(Build.MANUFACTURER)) {//小米手机ParachuteLog.d(TAG, "小米手机");requestPermission(context);} else if ("Meizu".equals(Build.MANUFACTURER)) {//魅族手机ParachuteLog.d(TAG, "魅族手机");requestPermission(context);} else {//其他手机ParachuteLog.d(TAG, "其他手机");if (Build.VERSION.SDK_INT >= 23) {if (!Settings.canDrawOverlays(context)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);Toast.makeText(context, "请开启应用显示悬浮窗权限!", Toast.LENGTH_SHORT).show();}}}}String time = SPUtils.get(context, "agreement_showtime", "0");ParachuteLog.d(TAG, "  get time =" + time);if(System.currentTimeMillis()>Long.valueOf(time)){final AgreementDialog dialog = new AgreementDialog(context);if(!(context instanceof Activity)){dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);}dialog.setCallback(agreementCallback);dialog.getWindow().setDimAmount(0.88f);dialog.show();} else {if (agreementCallback != null) {String newtime = (String) SPUtils.getOrigin(context, "agreement_showtime", "0");boolean agree = (boolean) SPUtils.getOrigin(context, "agreement_agree", false);agreementCallback.agreeCallback(false,agree, newtime);}}}

dialog必须依附于activity吗相关推荐

  1. dialog 弹框时activity生命周期调用过程

    dialog 弹框时activity生命周期调用过程 这个问题,分两部分 在普通activity弹框dialog,activity的onPause方法会被调用吗? activity a中给dialog ...

  2. android service中显示一个dialog

    转自:http://blog.csdn.net/huxueyan521/article/details/8954844 dialog是依附于activity存在的.但是app中经常需要使用以下的情况, ...

  3. Android中Activity、Window、ViewRootImpl与子线程更新UI

    三者层级关系 1.Window Window是一个抽象类,唯一的实现类是PhoneWindow Window分为三种类型应用Window.子Window.系统Window.子Window无法独立存在必 ...

  4. service中显示一个dialog

    dialog是依附于activity存在的.但是app中经常需要使用以下的情况,在service中做一些后台操作,在某个临界条件满足时,显示一个dialog告知用户. 这时dialog无法直接从ser ...

  5. android dialog service,Service中弹出Dialog

    dialog是依附于activity存在的.但是app中经常需要使用以下的情况,在service中做一些后台操作,在某个临界条件满足时,显示一个dialog告知用户. 这时dialog无法直接从ser ...

  6. ProgressDialog的hide()和dismiss()方法

    在使用ProgressDialog作为网络加载数据的请求过程中,当数据加载完成,笔者很自然的将ProgressDialog调用了hide()方法,在当前activity退出时,遇到问题了android ...

  7. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  8. android activity获取dialog对象,Android开发笔记之:Dialog的使用详解

    Dialog是任何系统都必须有的一个控件,作为辅助窗口,用于显示一些消息,或请求用户采取一引起操作等. 在Android中也不例外,基本使用可能参看文档. 使用时的注意事项1. BACK键能取消掉对话 ...

  9. Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    1  背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>, 然后有人在文章下面评论和微博 ...

  10. (转) Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    转载[工匠若水 http://blog.csdn.net/yanbober ] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与Layou ...

最新文章

  1. ninject 的 实现 的 理解
  2. 论文笔记:PPFNet
  3. 软件工程概论 课堂练习【空调公司维修服务流程】
  4. vant input框禁止调用手机键盘_【案例分享】适应网银等密码键盘的解决方案
  5. ES6的Proxy对象
  6. html加载富文本_富文本图片懒加载解决方案
  7. Hadoop中的一些基本操作
  8. python字符串出栈方法_Python学习之路_day_04(字符串与列表的内置方法)
  9. 使用 Visual Studio 创建 .NET 类库
  10. 数据可视化里 边框图片
  11. 计算机重新启动进不去系统,电脑关机重启进不了系统怎么办
  12. Unity获取手机app列表《三》安卓端
  13. 初识html及工具的使用
  14. JME sdk中的中文乱码(全是方框)的解决办法
  15. 程序依赖图(Program Dependency Graph)-(PDG)
  16. EAUML日拱一卒-微信小程序实战:位置闹铃 (5)-显示所在位置的信息
  17. 远程连接桌面到ubuntu登录闪退
  18. ABP官方文档(三)【模块系统】
  19. 即便您是个跑龙套的甲乙丙丁,也该认真对待您自个的角色
  20. 第15章、布局Layouts之TableLayout表格布局(从零开始学Android)

热门文章

  1. 烧写ubuntu16根文件系统到SD卡
  2. Android 之路39---GridView控件
  3. 污水泵站监控系统云平台功能
  4. BDTC 2017丨金融级分布式架构最佳实践
  5. 网络电视机顶盒怎么样?内行揭晓网络电视机顶盒排名
  6. 球幕投影产品介绍及球幕投影种类
  7. 亚派科技应邀出席全国医院建设大会公益行四川站暨西南智慧医院建设发展高峰论坛
  8. 服务实体经济,银行区块链应用正在画一个更大的圆
  9. C++ Java 23种设计模式的uml图表示及通俗介绍
  10. 华硕ASUS原厂OEM系统下载安装工厂模式安装教程