本文主要是介绍dialog必须依附于activity吗,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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吗的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!