精华内容
下载资源
问答
  • 主要介绍了Android开发实现判断通知是否打开及前往设置页面的方法,涉及Android通知栏的打开、判断、设置等相关操作技巧,需要的朋友可以参考下
  • 如果不去手动打开状态栏可以获取通知的设置,就算发送通知也看不到消息,但是小米手机就没事,人说获取手机型号进行适配,但是安卓手机机型太多,那样做是在是头疼,后来人说可以判断通知是否打开,这个方法...

    今天做项目用到通知,发现在oppo和360手机上,如果不去手动打开状态栏可以获取通知的设置,就算发送通知也看不到消息,但是小米手机就没事,有人说获取手机型号进行适配,但是安卓手机机型太多,那样做是在是头疼,后来有人说可以判断通知栏是否打开,这个方法不错,避免了要去判断所有的机型。

     private boolean isNotificationEnabled(Context context) {
            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);
                if ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED){
                    Toast.makeText(this,"true",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(this,"false",Toast.LENGTH_SHORT).show();
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage("是否跳转到设置页面");
                    builder.setTitle("提示");
                    builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            goToSet();
                            dialog.dismiss();
                        }
                    });
                    builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    builder.create().show();
                }
                return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return false;
        }
    在这里返回true,表示已经打开通知栏,返回false,弹出dialog选择是否跳转到设置页面,页面跳转方法如下:

     private void goToSet(){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BASE) {
                // 进入设置系统应用权限界面
                Intent intent = new Intent(Settings.ACTION_SETTINGS);
                startActivity(intent);
                return;
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {// 运行系统在5.x环境使用
                // 进入设置系统应用权限界面
                Intent intent = new Intent(Settings.ACTION_SETTINGS);
                startActivity(intent);
                return;
            }
        }



    展开全文
  • 项目中用到日程提醒功能,如果应用的通知栏没有打开,则需要提示用户前去打开通知栏,判断通知是否打开代码如下: private boolean isNotificationEnabled(Context context) { String CHECK_OP_NO_THROW = ...

    项目中用到日程提醒功能,如果应用的通知栏没有打开,则需要提示用户前去打开通知栏,判断通知栏是否打开代码如下:

     private boolean isNotificationEnabled(Context context) {
    
             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 (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return false;
        }
    返回值为true时,通知栏打开,false未打开。

    以下代码为前往设置页面:

    private void goToSet(){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BASE) {
                // 进入设置系统应用权限界面
                Intent intent = new Intent(Settings.ACTION_SETTINGS);
                startActivity(intent);
                return;
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {// 运行系统在5.x环境使用
                // 进入设置系统应用权限界面
                Intent intent = new Intent(Settings.ACTION_SETTINGS);
                startActivity(intent);
                return;
            }
        }
    注:测试功能时发现,若在应用设置中关闭app的通知栏/不勾选显示通知,则Toast无法显示

    展开全文
  • 1、全新、升级安装后判断系统是否屏蔽App的通知。 2、如果通知被屏蔽,弹出提醒开启通知的弹窗。 3、点击弹窗中“立即开启”按钮,跳转到系统对应的此App的通知设置界面。 解决方法: 1、判断通知App的通知功能...

    需求:

    1、全新、升级安装后判断系统是否屏蔽App的通知。

    2、如果通知被屏蔽,弹出提醒开启通知的弹窗。

    3、点击弹窗中“立即开启”按钮,跳转到系统对应的此App的通知设置界面。

    解决方法:

    1、判断通知App的通知功能是否被屏蔽。代码如下:

    NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
    boolean areNotificationsEnabled = notificationManagerCompat.areNotificationsEnabled();

    备注:此方法只针对Android4.3以及以上

    2、跳转到对应的通知设置页面。代码如下:

    public static void goSystemNotificationSetting(Context context) {
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    
                Uri uri = Uri.parse("package:" + context.getPackageName());
                Intent intentSet = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri);
                context.startActivity(intentSet);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    
                Intent intent = new Intent();
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("app_package", context.getPackageName());
                intent.putExtra("app_uid", context.getApplicationInfo().uid);
                context.startActivity(intent);
            } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
    
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                context.startActivity(intent);
            } else {
    
                Intent localIntent = new Intent();
                localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
                context.startActivity(localIntent);
            }
        }

     

     

    展开全文
  • 为何Android 8.0以上通知栏消息失效?为何模拟器上能显示真机却不行?这里面究竟藏着什么惊天秘密?且随我一探究竟!

    前不久因为API26(Android 8.0)以上的设备无法显示通知栏,所以网上查阅了比较多了资料,得出结论,API26以后引入了通知渠道这么个东西,然后就写了一篇问题对应的博文:Android 8.0通知栏(Notification)适配,在模拟上是完美运行,可是当我前两天安装到真机上测试时,咦?怎么又无效了?然后我就想着,是不是通知权限没打开?因为模拟器上很多权限的控制和真机上差别很大,我打开设置一看,还真是!那么本文就接着Android 8.0通知栏(Notification)适配作一个补充。

    Android 10 真机测试效果:

    在这里插入图片描述

    判断通知权限是否打开

    一行代码判断

    我们要打开通知 管理页面 第一步当然是判断 通知权限是否打开了? ,打开了我们就不需要跳转到通知管理页面了,没打开我们才进行跳转。

    这里我们用NotificationManagerCompat提供的 .areNotificationsEnabled() 方法来判断通知权限是否打开,返回的是boolean值

    NotificationManagerCompat.from(this).areNotificationsEnabled()
    

    注意:这个方法只适用于API19(Android 4.4)以上,API19以下会直接返回true,当然我们不是特殊开发也可以忽略了,毕竟现在市场上低于 Android4.4 的手机恐怕不好找,而且貌似Android4.4以下的对权限这块也没有太严格~

    areNotificationsEnabled() 的源码(可忽略)

    我们来看看 areNotificationsEnabled() 的源码,源码可以很清晰明朗地看到,API24以上直接调用 mNotificationManager.areNotificationsEnabled(); 方法,而 API19 -API 23 则是通过反射的方式来获取,API 19 以下就直接返回 true 了

     /**
         * Returns whether notifications from the calling package are not blocked.
         */
        public boolean areNotificationsEnabled() {
            if (Build.VERSION.SDK_INT >= 24) {
                return mNotificationManager.areNotificationsEnabled();
            } else if (Build.VERSION.SDK_INT >= 19) {
                AppOpsManager appOps =
                        (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
                ApplicationInfo appInfo = mContext.getApplicationInfo();
                String pkg = mContext.getApplicationContext().getPackageName();
                int uid = appInfo.uid;
                try {
                    Class<?> 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(appOps, value, uid, pkg)
                            == AppOpsManager.MODE_ALLOWED);
                } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException
                        | InvocationTargetException | IllegalAccessException | RuntimeException e) {
                    return true;
                }
            } else {
                return true;
            }
        }
    

    跳转到通知管理页面

    通知权限判断完了当然是要根据判断结果来进行跳转了,上面我们可以知道 NotificationManagerCompat.from(this).areNotificationsEnabled() 是会返回 boolean 值的,true 代表权限已经打开,反之则没有打开,这里我们可以写一个 if 语句根据返回结果来进行判断,这里直接给一个现成的方法吧

    方法逻辑:
    • 首先判断 通知权限是否打开
    • 如果判断结果是:false(权限没打开),再进行当前手机的 API 判断
    • 通过判断API,来调用不同的方法,实现跳转到应用通知设置的页面
    private boolean intent(Context context) {//判断应用的通知权限是否打开,返回Boolean值
            if (!NotificationManagerCompat.from(context).areNotificationsEnabled()) {
                Intent localIntent = new Intent();
                //判断API,跳转到应用通知管理页面
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0及以上
                    localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                    localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
                } else (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//8.0以下
                    localIntent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                    localIntent.putExtra("app_package", context.getPackageName());
                    localIntent.putExtra("app_uid", context.getApplicationInfo().uid);
                }
                context.startActivity(localIntent);
                return false;
            } 
            return true;
        }
    

    补充

    这里补充一下 Android 8.0 +的 Notification通知栏消息 的使用,相对于以前也只是加了一个NotificationChannel通知渠道,想要详细看的可以去我前一篇关于通知栏的博客:Android 8.0通知栏(Notification)适配

    方法逻辑
    • 首先通过上面的 通知权限判断 方法判断通知权限是否打开
    • 打开了的话判断当前手机的API,如果是在 26 (Android 8.0)以上则多实例化一个NotificationChannel对象,并传入一个 ID(用户不可见,要保证id的唯一性) 和一个 Name(用户能看到) ,最后是一个通知的优先级,这里我设置的 高(IMPORTANCE_HIGH)
    • 如果API 在 26 以下,我们则直接调用以前使用的方法即可,这样就可以兼容上下API了
    public void show(Context context, String title, String msg) {
    
        if (intent(context)) {
            NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
            Notification notification = null;
            if (Build.VERSION.SDK_INT >= 26) {//API26以上的方法
                NotificationChannel channel = new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_HIGH);
                manager.createNotificationChannel(channel);
                notification = new Notification.Builder(context, "id")
                        .setContentTitle(title)
                        .setContentText(msg)
                        .setSmallIcon(R.mipmap.img_icon)
                        .build();
            } else {//API26以下
                notification = new Notification.Builder(context)
                        .setContentTitle(title)
                        .setContentText(msg)
                        .setSmallIcon(R.mipmap.img_icon)
                        .build();
            }
            manager.notify(1, notification);
        }
    
    }
    

    如果文章对你还算有点帮助,点个赞吧!

    在这里插入图片描述

    展开全文
  • 通常我们在开发即时通讯App时,...设置界面1、判断用户是否开启了悬浮通知(横幅通知)通过通知渠道ID,获取通知重要性级别,从而知晓是否开启了悬浮通知(横幅通知)NotificationManager mNotificationManager = (Noti...
  • iOS 判断当前页面是否显示

    千次阅读 2016-05-09 11:36:05
    时候需要判断当前页面是否显示。构想一个场景:当用户使用app的时候,手机锁屏后解开屏幕锁,手机app进入前台。需要判断当前页面a还是页面b呈现给了用户。如果页面a呈现给用户,那么需要请求页面a的数据,如果页面...
  • 点击常驻通知栏图标时,是重新启动了应用,我想实现的是如果应用已经启动则返回已经启动的应用,否则启动该应用。  可是这个要怎么实现呢,应该是要设置一下Intent,上网查了一下,果然是Intent要进行一些设置:...
  • // 判断客户是否开启通知,如果没开启,则跳转到设置页面,start var main = plus.android.runtimeMainActivity(); var pkName = main.getPackageName(); var NotificationManagerCompat = plus.android....
  • 我们开发中经常要接入类似极光推送等推送的功能,但是时候我们接入的各部分都正常,就是没有通知栏的通知。...首先我们要判断用户是否打开了权限,这个一般在首页进行判断 private boolean isNot...
  • public static boolean isPermissionOpen(Context context) { //判断是否有打开通知栏权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return NotificationManagerCompat.from(context)....
  • js判断用户是否离开当前页面

    千次阅读 2018-11-28 16:05:39
    通过文档的(点击,按键)事件判断用户是否在操作,看你的操作是否有鼠标滑来滑去的操作,并且不需要按键和点击来完成的话,建议在增加多一个鼠标移动事件 在多长时间内如果用户都没有触发这些事件的话,就判定为...
  • 先上代码: ... * 判断当前app是否打开通知 */ private void checkNotification() { NotificationManagerCompat notification = NotificationManagerCompat.from(this); boolean isEnabled = n...
  • 当APP推送功能时,需要判断当前app在手机中是否开启了允许消息推送,否则即使添加了推送代码仍然收不到通知 上代码 private boolean isNotificationEnabled() { String CHECK_OP_NO_THROW = "...
  • 1、判断是否打开NotificationManagerCompat notification = NotificationManagerCompat.from(this); boolean isEnabled = notification.areNotificationsEnabled();2、跳转设置if (Build.VERSION.SDK_INT &gt;= ...
  • 我就偷懒了,直接贴代码了 这个我写在MainActivity的onCreate()里面的,相当于进入主页面检查一下 if (Build.VERSION.SDK_INT &... //判断是否需要开启通知栏功能 NotificationUtil.OpenNotificatio...
  • web页面判断手机里是否安转应用的原理就是:首先试着打开手机端某个app的本地协议;如果超时就转到app下载页,下载该app。 下面说说 URL scheme 概述 URL scheme 的作用 客户端应用可以向操作系统注册一个 URL ...
  • 判断当前应用通知是否打开方法: private boolean isNotificationEnabled(Context context) { String CHECK_OP_NO_THROW = "checkOpNoThrow"; String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
  • 说说思路,通过新建广播接收器,动态注册广播接收器,由登录按钮点击发送广播,在广播接收器接收,接收后在onReceive中做出逻辑判断,然后将得到的值存在全局变量中,在需要判断页面变化的页面加入判断。 public...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,417
精华内容 35,766
关键字:

判断页面是否有新通知