123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package com.edufound.mobile.util;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AppOpsManager;
- import android.app.NotificationManager;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.content.pm.ApplicationInfo;
- import android.net.Uri;
- import android.os.Build;
- import android.support.annotation.RequiresApi;
- import android.support.v4.app.NotificationManagerCompat;
- import android.view.View;
- import android.widget.TextView;
- import com.edufound.mobile.R;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class NotificationUtil {
- public static void choseNotification(Activity activity) {
- //如果是新应用,查询权限并且询问
- if (SPutil.getPrefInt(activity, SPutil.notificationType, 0) == 0) {
- if (NotificationUtil.areNotificationsEnabled(activity)) {
- //有权限
- SPutil.setPrefInt(activity, SPutil.notificationType, SPutil.NOTIFICATION_OPEN);
- } else {
- //没权限
- SPutil.setPrefInt(activity, SPutil.notificationType, SPutil.NOTIFICATION_CLOSE);
- NotificationUtil.showDialog(activity);
- }
- } else {
- //不是第一次新应用,如果设置了有权限,就设置系统默认的权限,不提示
- if (NotificationUtil.areNotificationsEnabled(activity)) {
- //有权限
- SPutil.setPrefInt(activity, SPutil.notificationType, SPutil.NOTIFICATION_OPEN);
- } else {
- //没权限
- SPutil.setPrefInt(activity, SPutil.notificationType, SPutil.NOTIFICATION_CLOSE);
- }
- }
- }
- private static boolean areNotificationsEnabled(Context context) {
- NotificationManagerCompat.from(context).areNotificationsEnabled();
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
- return true;
- }
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
- return isEnableV19(context);
- } else {
- return isEnableV26(context);
- }
- }
- @RequiresApi(api = Build.VERSION_CODES.KITKAT)
- private static boolean isEnableV19(Context context) {
- final String CHECK_OP_NO_THROW = "checkOpNoThrow";
- final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
- AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
- ApplicationInfo appInfo = context.getApplicationInfo();
- String pkg = context.getApplicationContext().getPackageName();
- int uid = appInfo.uid;
- Class appOpsClass = null; /* Context.APP_OPS_MANAGER */
- 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 e) {
- } catch (NoSuchMethodException e) {
- } catch (NoSuchFieldException e) {
- } catch (InvocationTargetException e) {
- } catch (IllegalAccessException e) {
- } catch (Exception e) {
- }
- return false;
- }
- private static boolean isEnableV26(Context context) {
- ApplicationInfo appInfo = context.getApplicationInfo();
- String pkg = context.getApplicationContext().getPackageName();
- int uid = appInfo.uid;
- try {
- NotificationManager notificationManager = (NotificationManager)
- context.getSystemService(Context.NOTIFICATION_SERVICE);
- Method sServiceField = notificationManager.getClass().getDeclaredMethod("getService");
- sServiceField.setAccessible(true);
- Object sService = sServiceField.invoke(notificationManager);
- Method method = sService.getClass().getDeclaredMethod("areNotificationsEnabledForPackage"
- , String.class, Integer.TYPE);
- method.setAccessible(true);
- return (boolean) method.invoke(sService, pkg, uid);
- } catch (Exception e) {
- return true;
- }
- }
- private static void showDialog(final Activity act) {
- AlertDialog.Builder builder = new AlertDialog.Builder(act)
- // .setIcon(R.mipmap.ic_launcher)
- .setTitle("提示")
- .setMessage("检测到您没有打开通知权限,是否去打开")
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- dialogInterface.cancel();
- Intent localIntent = new Intent();
- localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- if (Build.VERSION.SDK_INT >= 9) {
- localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
- localIntent.setData(Uri.fromParts("package", act.getPackageName(), null));
- } else if (Build.VERSION.SDK_INT <= 8) {
- localIntent.setAction(Intent.ACTION_VIEW);
- localIntent.setClassName("com.android.settings",
- "com.android.settings.InstalledAppDetails");
- localIntent.putExtra("com.android.settings.ApplicationPkgName",
- act.getPackageName());
- }
- act.startActivity(localIntent);
- }
- }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int i) {
- dialog.cancel();
- }
- });
- builder.create().show();
- }
- }
|