• NotificationSetUtilDemo【判断APP通知栏权限是否开启,以及如何跳转到应用程序设置界面】


    前言

    当APP有推送功能时,需要判断当前app在手机中是否开启了允许消息推送,否则即使添加了推送代码仍然收不到通知。

    效果图

    oppo上的效果:

    使用步骤

    一、项目组织结构图

    注意事项:

    1、  导入类文件后需要change包名以及重新import R文件路径

    2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

    二、导入步骤

    1、将NotificationSetUtil.java类复制到项目中

    package com.why.project.notificationsetutildemo.utils;
    
    import android.app.AppOpsManager;
    import android.content.Context;
    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 java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * Created by HaiyuKing
     * Used 判断是否开启消息通知,没有开启的话跳转到手机系统设置界面
     * 参考:https://blog.csdn.net/lidayingyy/article/details/81778894
     * https://www.jianshu.com/p/205bc87cac29
     * https://blog.csdn.net/yrmao9893/article/details/74607402/
     * https://www.meiwen.com.cn/subject/qcklpftx.html
     */
    public class NotificationSetUtil {
    
        //判断是否需要打开设置界面
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        public static void OpenNotificationSetting(Context context, OnNextLitener mOnNextLitener) {
            if (!isNotificationEnabled(context)) {
                gotoSet(context);
            } else {
                if (mOnNextLitener != null) {
                    mOnNextLitener.onNext();
                }
            }
        }
    
        //判断该app是否打开了通知
        /**
         * 可以通过NotificationManagerCompat 中的 areNotificationsEnabled()来判断是否开启通知权限。NotificationManagerCompat 在 android.support.v4.app包中,是API 22.1.0 中加入的。而 areNotificationsEnabled()则是在 API 24.1.0之后加入的。
         * areNotificationsEnabled 只对 API 19 及以上版本有效,低于API 19 会一直返回true
         * */
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        public static boolean isNotificationEnabled(Context context) {
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
                boolean areNotificationsEnabled = notificationManagerCompat.areNotificationsEnabled();
                return areNotificationsEnabled;
            }
    
            String CHECK_OP_NO_THROW = "checkOpNoThrow";
            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 = (Integer) opPostNotificationValue.get(Integer.class);
                return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
    
        }
    
        //打开手机设置页面
        /**
         * 假设没有开启通知权限,点击之后就需要跳转到 APP的通知设置界面,对应的Action是:Settings.ACTION_APP_NOTIFICATION_SETTINGS, 这个Action是 API 26 后增加的
         * 如果在部分手机中无法精确的跳转到 APP对应的通知设置界面,那么我们就考虑直接跳转到 APP信息界面,对应的Action是:Settings.ACTION_APPLICATION_DETAILS_SETTINGS*/
        private static void gotoSet(Context context) {
    
            Intent intent = new Intent();
            if (Build.VERSION.SDK_INT >= 26) {
                // android 8.0引导
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());
            } else if (Build.VERSION.SDK_INT >= 21) {
                // android 5.0-7.0
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("app_package", context.getPackageName());
                intent.putExtra("app_uid", context.getApplicationInfo().uid);
            } else {
                // 其他
                intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                intent.setData(Uri.fromParts("package", context.getPackageName(), null));
            }
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    
        /*=====================添加Listener回调================================*/
        public interface OnNextLitener {
            /**
             * 不需要设置通知的下一步
             */
            void onNext();
        }
    
        private OnNextLitener mOnNextLitener;
    
        public void setOnNextLitener(OnNextLitener mOnNextLitener) {
            this.mOnNextLitener = mOnNextLitener;
        }
    }
    NotificationSetUtil.java

    三、使用方法

    package com.why.project.notificationsetutildemo;
    
    import android.content.Context;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.Toast;
    
    import com.why.project.notificationsetutildemo.utils.NotificationSetUtil;
    
    public class MainActivity extends AppCompatActivity {
    
        private Context mContext;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mContext = this;
    
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                //判断是否需要开启通知栏功能
                NotificationSetUtil.OpenNotificationSetting(mContext, new NotificationSetUtil.OnNextLitener() {
                    @Override
                    public void onNext() {
                        Toast.makeText(mContext,"已开启通知权限",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    }

    混淆配置

    参考资料

    Android 判断当前应用是否开启消息通知

    Android通知栏权限是否开启

    Android 判断应用程序获取通知栏权限是否开启,以及如何跳转到应用程序设置界面

    Android:检查通知权限并跳转到通知设置界面

    项目demo下载地址

     暂不需要

  • 相关阅读:
    (二十三)、int与integer的区别
    (二十一)、Java序列化与反序列化
    (二十)、MVC设计思想的优缺点
    (十九)、列出自己常用的JDK包
    (十八)、Session与Cookie区别
    win10 下安装laravel
    冒泡排序
    常用php正则表达式
    AE网站
    AE压缩网站
  • 原文地址:https://www.cnblogs.com/whycxb/p/10077418.html
Copyright © 2020-2023  润新知