声明:该方案只对API19及以上版本有效

一、目标需求

最近项目中在完善推送功能,需要进入APP时检测一下是否开启了推送权限,如果没有开启弹窗提醒,当用户点击弹窗时直接跳转到APP的通知设置界面,就像下面这种:

就是这种效果

二、需求实现

1、检测是否开启通知权限

接到需求时一脸懵,不知道咋实现,先是一番搜索,搜索后得知可以通过NotificationManagerCompat 中的 areNotificationsEnabled()来判断是否开启通知权限。

查阅官方文档可知 NotificationManagerCompat 在 android.support.v4.app包中,是API 22.1.0 中加入的。而 areNotificationsEnabled()则是在 API 24.1.0之后加入的。

注意:

areNotificationsEnabled 只对 API 19 及以上版本有效,低于API 19 会一直返回true

2、跳转到通知设置界面

假设没有开启通知权限,点击之后就需要跳转到 APP的通知设置界面,对应的Action是:Settings.ACTION_APP_NOTIFICATION_SETTINGS, 这个Action是 API 26 后增加的。APP的通知设置界面如下图:

APP的通知设置界面

如果在部分手机中无法精确的跳转到 APP对应的通知设置界面,那么我们就考虑直接跳转到 APP信息界面,对应的Action是:Settings.ACTION_APPLICATION_DETAILS_SETTINGS。APP信息界面如下图:

APP信息界面

3、代码实现:

不多说了,代码其实很简单,注释也很明了,直接上代码:

(1)、java版(使用了DataBinding-数据绑定)

/*** 作者:CnPeng* 时间:2018/7/11* 功用:检测在设置中是否开启了APP的推送* 其他:** 参考链接:* https://stackoverflow.com/questions/32366649/any-way-to-link-to-the-android-notification-settings-for-my-app* https://blog.csdn.net/ysy950803/article/details/71910806* https://juejin.im/post/5a2508656fb9a0450407b638*/
public class CheckNotifyActivity extends AppCompatActivity {ActivityCheckNotifyBinding mBinding;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBinding = DataBindingUtil.setContentView(this, R.layout.activity_check_notify);initClickListener();}@Overrideprotected void onResume() {super.onResume();checkNotifySetting();}/*** 作者:CnPeng* 时间:2018/7/12 上午8:02* 功用:初始化点击事件* 说明:*/private void initClickListener() {//CnPeng 2018/7/12 上午7:08 跳转到通知设置界面mBinding.tvMsg.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {// 根据isOpened结果,判断是否需要提醒用户跳转AppInfo页面,去打开App通知权限Intent intent = new Intent();intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);//这种方案适用于 API 26, 即8.0(含8.0)以上可以用intent.putExtra(EXTRA_APP_PACKAGE, getPackageName());intent.putExtra(EXTRA_CHANNEL_ID, getApplicationInfo().uid);//这种方案适用于 API21——25,即 5.0——7.1 之间的版本可以使用intent.putExtra("app_package", getPackageName());intent.putExtra("app_uid", getApplicationInfo().uid);// 小米6 -MIUI9.6-8.0.0系统,是个特例,通知设置界面只能控制"允许使用通知圆点"——然而这个玩意并没有卵用,我想对雷布斯说:I'm not ok!!!//  if ("MI 6".equals(Build.MODEL)) {//      intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);//      Uri uri = Uri.fromParts("package", getPackageName(), null);//      intent.setData(uri);//      // intent.setAction("com.android.settings/.SubSettings");//  }startActivity(intent);} catch (Exception e) {e.printStackTrace();// 出现异常则跳转到应用设置界面:锤子坚果3——OC105 API25Intent intent = new Intent();//下面这种方案是直接跳转到当前应用的设置界面。//https://blog.csdn.net/ysy950803/article/details/71910806intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getPackageName(), null);intent.setData(uri);startActivity(intent);}}});}/*** 作者:CnPeng* 时间:2018/7/12 上午9:02* 功用:检查是否已经开启了通知权限* 说明:*/private void checkNotifySetting() {NotificationManagerCompat manager = NotificationManagerCompat.from(this);// areNotificationsEnabled方法的有效性官方只最低支持到API 19,低于19的仍可调用此方法不过只会返回true,即默认为用户已经开启了通知。boolean isOpened = manager.areNotificationsEnabled();if (isOpened) {mBinding.tvMsg.setText("通知权限已经被打开" +"\n手机型号:" + android.os.Build.MODEL +"\nSDK版本:" + android.os.Build.VERSION.SDK +"\n系统版本:" + android.os.Build.VERSION.RELEASE +"\n软件包名:" + getPackageName());} else {mBinding.tvMsg.setText("还没有开启通知权限,点击去开启");}}
}

(2)、kotlin版

/*** 作者:CnPeng* 时间:2018/7/12* 功用:检查通知推送是否已经被打开* 其他:*/
public class PushCheckActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_push_check)initClickListener()}override fun onResume() {super.onResume()checkPushSwitchStatus()}/*** 作者:CnPeng* 时间:2018/7/12 下午3:43* 功用:检查通知推送的开关状态* 说明:*/private fun checkPushSwitchStatus() {val notificationManager: NotificationManagerCompat = NotificationManagerCompat.from(this);val isOpend = notificationManager.areNotificationsEnabled()if (isOpend) {tv_msg.text = "通知权限已经被打开" +"\n手机型号:${android.os.Build.MODEL}" +"\nSDK版本:${android.os.Build.VERSION.SDK_INT}" +"\n系统版本:${android.os.Build.VERSION.RELEASE}" +"\n软件包名:${getPackageName()}"} else {tv_msg.text = "通知权限没有被开启,点击去开启"}}private fun initClickListener() {tv_msg.setOnClickListener {val intent: Intent = Intent()try {intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS//8.0及以后版本使用这两个extra.  >=API 26intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)intent.putExtra(Settings.EXTRA_CHANNEL_ID, applicationInfo.uid)//5.0-7.1 使用这两个extra.  <= API 25, >=API 21intent.putExtra("app_package", packageName)intent.putExtra("app_uid", applicationInfo.uid)startActivity(intent)} catch (e: Exception) {e.printStackTrace()//其他低版本或者异常情况,走该节点。进入APP设置界面intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGSintent.putExtra("package", packageName)//val uri = Uri.fromParts("package", packageName, null)//intent.data = uristartActivity(intent)}}}
}

4、踩坑记录

A: com.android.support包的版本

因为 NotificationManagerCompat 是 22.1.0才有的,其中的 areNotificaitonEnabled() 是 24.1.0 才有的,Settings.ACTION_APP_NOTIFICATION_SETTINGS 是 26 才有的,所以,为了保证这些内容在不同版本中生效,最好在 gradle文件中 support 的版本升级到最新。如:

implementation 'com.android.support:appcompat-v7:27.1.1'

B: 部分国产手机中没有APP通知设置页面

在部分国产手机系统中,Settings.ACTION_APPLICATION_DETAILS_SETTINGS对应的Activity是不存在的,比如:锤子坚果3——OC105 API25。

所以,在坚果3手机上,最终会走我们代码中的 catch 节点,然后进入到 应用信息界面。

下面两张图分别是 锤子坚果3 手机的截图。第一张是 设置--通知中心的界面,点击之后只是一个开关的开启和关闭,并没有再进入详细的通知设置界面。第二张是 应用管理--应用程序管理--应用信息界面, 点击其中的 允许推送通知时也只是开关的开启和关闭。

设置--通知中心

应用信息

C: 部分国产手机 APP通知设置界面中没有开启和关闭的操作

部分国产手机中 Settings.ACTION_APPLICATION_DETAILS_SETTINGS对应的Activity并不是我们期望的通知设置界面。比如,小米6。小米6中 Settings.ACTION_APPLICATION_DETAILS_SETTINGS对应的通知设置界面如下:

这完全不是我们需要的界面啊。。。里面并没有我们想要的开关啊。而且,在小米6中 Settings.ACTION_APPLICATION_DETAILS_SETTINGS 对应的应用信息界面中,点击其中的 通知管理 之后跳转的也是上面图中的样子。

但是,如果我们手动的从 设置--通知和状态栏--通知管理 进入我们应用的通知设置界面时,就可以正常的看到 允许通知的开关,如下图:

对于小米6手机的这个情况,分析了一阵子之后还是没找到解决办法。本来想着通过log确认一下上图中的界面到底是哪个Activity,但非常郁闷的是Log中只得到了com.android.settings/.SubSettings 这么一个地址,之前没见过这个地址,然后继续搜索。

在看完 https://www.cnblogs.com/Lefter/archive/2013/04/27/3048010.html 和 https://blog.csdn.net/hfreeman2008/article/details/52778992 之后,明白了 .SubSettings 是干啥的了。也大致推断出为啥在小米6上得不到我们想要的界面了——他们在定制系统时更改了通知设置界面对应的Fragment!!!!

此时,真想对雷布斯说一句:I'm not ok!!!!

三、附录

1、测试结果说明

手机型号 系统版本 测试结果
Vivo X9s 7.1.2 正常跳转到通知设置界面
荣耀10 8.1.0 正常跳转到通知设置界面
红米note4x 7.0 正常跳转到通知设置界面
Oppo R7 plus 5.0 正常跳转到通知设置界面
ZTE BA910 5.1 正常跳转到通知设置界面
Oppo R15 8.1.0 正常跳转到通知设置界面
三星盖乐世On5 7.1.1 正常跳转到通知设置界面
360Vizza 7.1.1 正常跳转到通知设置界面
魅族Mx3 4.4 进入APP设置界面
华为荣耀4X 4.4 进入APP设置界面
锤子坚果3 7.1.2 进入APP设置界面
小米6 8.0.0 进入的页面中没有通知开关!!!!

2、参考链接

(1)通知设置的参考链接
  • https://stackoverflow.com/questions/32366649/any-way-to-link-to-the-android-notification-settings-for-my-app
  • https://blog.csdn.net/ysy950803/article/details/71910806
  • https://juejin.im/post/5a2508656fb9a0450407b638

(2)SubSettings 和 Settings 的参考链接

  • https://www.cnblogs.com/Lefter/archive/2013/04/27/3048010.html
  • https://blog.csdn.net/hfreeman2008/article/details/52778992

3、文中代码的GitHub地址

文中代码分别对应下列仓库中的:b_34_checkNotify、b_34_pushcheck
Java版:https://github.com/CnPeng/CnPengAndroid.git
Kotlin版:https://github.com/CnPeng/CnPengKotlin.git


本文到此结束,谢谢观看!如有不足,敬请指正!


http://www.taodudu.cc/news/show-4252804.html

相关文章:

  • foxmai邮件服务器pop,全球邮企业邮箱Foxmail POP3/IMAP协议设置方法
  • 【QT小记】设置窗口背景透明
  • 如何实现背景/背景图片透明文字不透明
  • python显示透明图片背景
  • CSS 第005 背景-理论
  • 汇总2022年12月托福toefl考试/解析答案为你助力
  • 将制作好的系统启动U盘还原
  • 还原启动U盘
  • Win10系统U盘重装恢复出厂设置的方法
  • 【绿盟】检测到目标Strict-Transport-Security响应头缺失
  • 分布式漏洞扫描
  • android 路由器 操作系统,小米全新路由器操作系统是什么?支持什么语言?
  • wifi爆破学习记录
  • 【支线】基于Aidlux的Arduino小车
  • 【杂记】全栈开发中碰到的一些问题及解决方法
  • 计算机网络的super super easy 教程 | 基础 及 数据链路层
  • 从真正的零组建一台日常使用PC+NAS
  • 小米随身wif linux平台配置
  • 记一次无线渗透
  • 嵌入式系统之-小米路由器3G v1
  • 微信视频号打造带货闭环:主播叫苦连天
  • 爬虫技术python爬到女性语音_python爬虫看看虎牙女主播中谁最“顶”步骤详解
  • 做电商直播绝不能忽视的事:主播人设和账号定位
  • Chromedriver插件的安装
  • VS Code 高效“摸鱼”插件推荐
  • QQ9.0需要安装两个插件
  • 新电脑 安装idea迁移设置和插件注意事项
  • 5款神仙插件,打工人用了效率提升5倍
  • Android wear 睡眠追踪,为什么智能手表还不是最理想的睡眠追踪设备
  • 睡眠助手APP开发解决方案

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

  1. Android 点击跳转到蓝牙设置界面

    点击跳转到蓝牙设置界面 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  2. iOS 跳转到Wi-Fi设置界面

    //  iOS之前跳转到Wi-Fi设置界面的代码 在点击跳转的按钮动作中添加如下代码 [[UIApplication sharedApplication] openURL:[NSURL URLWith ...

  3. Android常用控件之Fragment仿Android4.0设置界面

    Fragment是Android3.0新增的概念,是碎片的意思,它和Activity很相像,用来在一个Activity中描述一些行为或部分用户界面:使用多个Fragment可以在一个单独的Activi ...

  4. android打开蓝牙设置界面,Android 点击跳转到蓝牙设置界面

    基于H5的微信支付开发详解 这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲 ...

  5. iOS10从app跳转到WiFi设置界面

    let url = URL(string: "App-Prefs:root=WIFI")if #available(iOS 10.0, *) {UIApplication.shar ...

  6. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )

    文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...

  7. android跳转到系统的各项设置界面

    前言: 由于需求需要,有很多时候都需要跳转到android的各项设置界面,比如说Wi-Fi列表页,系统设置主页,应用权限管理界面等等,但是很多人都不知道对应的Activity Action是什么,现在 ...

  8. iOS 权限判断 跳转对应设置界面

    相机权限 1.1 使用说明 在合适的地方导入#import <AVFoundation/AVFoundation.h> 使用AVAuthorizationStatus类获取当前权限状态 在 ...

  9. android 跳转到系统Settings界面的所有Intent

    文章目录 1.简介 2.具体界面 1.简介 跳转到Setting 界面 常用的 intent 意图 2.具体界面 1)Setings //跳转到setting 界面 Intent intent = n ...

最新文章

  1. python walk 遍历文件夹 文件大小
  2. SAP按单生产和重复制造
  3. CIKERS Shane 20190530
  4. oracle sql语句大全
  5. C语言实训作业PPT,C语言实训作业.docx
  6. 如何更流畅地使用 Google 搜索?
  7. JS实现快递单打印功能
  8. Python 画星星图案
  9. Vision Transformer(VIT)代码分析——保姆级教程
  10. 138个医共体!紧密型县域医共体建设和改革,这个省这么干
  11. UML知识点总结(一)
  12. AI自动剪辑生成视频探索实践
  13. 洛谷 U5750 疯暴英雄
  14. SkeyeVSS实现RTSP、Onvif监控摄像头网页无插件化直播监控解决方案
  15. 运放电压和电流负反馈的讨论
  16. Linux命令行操作串口收发数据(stty命令)
  17. ViT/vit/VIT详解
  18. 怎样在Mac或Windows上的Parallels中删除虚拟机?
  19. unity | 输入汉字自动转换成带拼音(带声调)
  20. 出游戏本可能也救不了小米笔记本

热门文章

  1. android横屏分辨率,android适配不同分辨率hdpi、mdpi、ldpi横屏竖屏
  2. 福利彩票选号盘(silverlight5 开源)
  3. MOT 指标汇总 (详讲 说明 含义 )
  4. php qq远程桌面共享,新手学堂:用VNC实现远程桌面共享的方法
  5. 免费在线思维导图网站,这么好用一定要收藏
  6. vue 点击展开显示更多 点击收起部分隐藏
  7. 网络爬虫--记一次有趣的侦察型反爬手段(ebay)
  8. 第1章第6节:如何打开之前编辑过的演示文稿 [PowerPoint精美幻灯片实战教程]
  9. luffy-(13)
  10. 如何理解ANOVA中的F值与P值