是如果说有些情况下获取不到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); } } }