如何在android中以编程方式打开/关闭“显示通知”

Vin*_*tti 3 notifications android

在此处输入图片说明我有一个要求,我需要以编程方式启用和禁用 App Info 的“显示通知”。我在谷歌上搜索了很长时间,但找不到合适的解决方案。这是否可以在 android 中以编程方式打开/关闭“显示通知”?提前致谢。

Vin*_*tti 5

实际上,没有办法以编程方式打开/关闭通知,我们可以使用以下代码执行此操作的唯一方法。

public class CustomToast {

  private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
  private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";

  public static void makeText(Context mContext, String message, int time) {
    if (isNotificationEnabled(mContext)) {
      //Show Toast message 
      Toast.makeText(mContext, message, time).show();
    } else {
      // Or show own custom alert dialog
      showCustomAlertDialog(mContext, message);
    }
  }

  private static boolean isNotificationEnabled(Context mContext) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      AppOpsManager mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
      ApplicationInfo appInfo = mContext.getApplicationInfo();
      String pkg = mContext.getApplicationContext().getPackageName();
      int uid = appInfo.uid;
      Class appOpsClass;
      try {
        appOpsClass = Class.forName(AppOpsManager.class.getName());
        Method checkOpNoThrowMethod =
            appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);

        Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
        int value = (int) opPostNotificationValue.get(Integer.class);
        return ((int) checkOpNoThrowMethod.invoke(mAppOps, value, uid,
            pkg) == AppOpsManager.MODE_ALLOWED);
      } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException
          | InvocationTargetException | IllegalAccessException ex) {
        Utils.logExceptionCrashLytics(ex);
      }
      return false;
    } else {
      return false;
    }
  }

  private static void showCustomAlertDialog(Context mContext, String message) {
      if (!(mContext instanceof Activity && ((Activity)mContext).isFinishing())) {
          AlertDialog.Builder mBuilder = new AlertDialog.Builder(mContext);
          mBuilder.setMessage(message);
          mBuilder.setPositiveButton(mContext.getString(R.string.ok),
                  new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                          dialog.dismiss();
                      }
                  });
          mBuilder.setCancelable(true);
          AlertDialog alertDialog = mBuilder.create();
          alertDialog.show();
      }
    }
}
Run Code Online (Sandbox Code Playgroud)