Android:检查通知权限并跳转到通知设置界面
声明:该方案只对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信息界面,对应的Action是:Settings.ACTION_APPLICATION_DETAILS_SETTINGS
。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:检查通知权限并跳转到通知设置界面相关推荐
- Android 点击跳转到蓝牙设置界面
点击跳转到蓝牙设置界面 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- iOS 跳转到Wi-Fi设置界面
// iOS之前跳转到Wi-Fi设置界面的代码 在点击跳转的按钮动作中添加如下代码 [[UIApplication sharedApplication] openURL:[NSURL URLWith ...
- Android常用控件之Fragment仿Android4.0设置界面
Fragment是Android3.0新增的概念,是碎片的意思,它和Activity很相像,用来在一个Activity中描述一些行为或部分用户界面:使用多个Fragment可以在一个单独的Activi ...
- android打开蓝牙设置界面,Android 点击跳转到蓝牙设置界面
基于H5的微信支付开发详解 这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲 ...
- iOS10从app跳转到WiFi设置界面
let url = URL(string: "App-Prefs:root=WIFI")if #available(iOS 10.0, *) {UIApplication.shar ...
- 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )
文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...
- android跳转到系统的各项设置界面
前言: 由于需求需要,有很多时候都需要跳转到android的各项设置界面,比如说Wi-Fi列表页,系统设置主页,应用权限管理界面等等,但是很多人都不知道对应的Activity Action是什么,现在 ...
- iOS 权限判断 跳转对应设置界面
相机权限 1.1 使用说明 在合适的地方导入#import <AVFoundation/AVFoundation.h> 使用AVAuthorizationStatus类获取当前权限状态 在 ...
- android 跳转到系统Settings界面的所有Intent
文章目录 1.简介 2.具体界面 1.简介 跳转到Setting 界面 常用的 intent 意图 2.具体界面 1)Setings //跳转到setting 界面 Intent intent = n ...
最新文章
- python walk 遍历文件夹 文件大小
- SAP按单生产和重复制造
- CIKERS Shane 20190530
- oracle sql语句大全
- C语言实训作业PPT,C语言实训作业.docx
- 如何更流畅地使用 Google 搜索?
- JS实现快递单打印功能
- Python 画星星图案
- Vision Transformer(VIT)代码分析——保姆级教程
- 138个医共体!紧密型县域医共体建设和改革,这个省这么干
- UML知识点总结(一)
- AI自动剪辑生成视频探索实践
- 洛谷 U5750 疯暴英雄
- SkeyeVSS实现RTSP、Onvif监控摄像头网页无插件化直播监控解决方案
- 运放电压和电流负反馈的讨论
- Linux命令行操作串口收发数据(stty命令)
- ViT/vit/VIT详解
- 怎样在Mac或Windows上的Parallels中删除虚拟机?
- unity | 输入汉字自动转换成带拼音(带声调)
- 出游戏本可能也救不了小米笔记本
热门文章
- android横屏分辨率,android适配不同分辨率hdpi、mdpi、ldpi横屏竖屏
- 福利彩票选号盘(silverlight5 开源)
- MOT 指标汇总 (详讲 说明 含义 )
- php qq远程桌面共享,新手学堂:用VNC实现远程桌面共享的方法
- 免费在线思维导图网站,这么好用一定要收藏
- vue 点击展开显示更多 点击收起部分隐藏
- 网络爬虫--记一次有趣的侦察型反爬手段(ebay)
- 第1章第6节:如何打开之前编辑过的演示文稿 [PowerPoint精美幻灯片实战教程]
- luffy-(13)
- 如何理解ANOVA中的F值与P值