Android12版本闹钟服务崩溃问题
公司项目app线上出现的崩溃记录问题,崩溃日志如下所示:
Caused by java.lang.SecurityException: Caller com.health.trackeranz needs to hold android.permission.SCHEDULE_EXACT_ALARM or android.permission.USE_EXACT_ALARM to set exact alarms.
一看到是安全异常,估计就是高版本android系统加的限制了,原因就是没正确适配新权限导致的崩溃问题
先贴下已解决的代码:
//在第二天的0:00清理发出清理数据的广播
val calendar: Calendar = Calendar.getInstance()
calendar.set(Calendar.HOUR_OF_DAY, 0)
calendar.set(Calendar.MINUTE, 0)
calendar.set(Calendar.SECOND, 0)
calendar.add(Calendar.DAY_OF_MONTH, 1)
//测试用的数据,闹钟定为60s后
//val calendar: Calendar = Calendar.getInstance()
//calendar.add(Calendar.SECOND, 60)
val alarmManager = application.getSystemService<AlarmManager>()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && alarmManager?.canScheduleExactAlarms()==false) {
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),
pendingIntent
)
} else {
alarmManager?.setExact(
AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),
pendingIntent
)
}
LogUtils.d("闹钟已启动,预定触发时间:" + TimeUtils.date2String(calendar.time))
这里代码注意alarmManager?.canScheduleExactAlarms()==false这个判断,之前没有添加次判断,于是就有了上文提及的崩溃问题
复现的话很容易,去设置页面里,把应用的闹钟服务关闭就会出现了,如下图所示

原因
首先,了解下alarmManager设置定时的3个方法:
setExactAndAllowWhileIdle(long triggerAtMillis, PendingIntent operation):这个方法用于设置精确的闹钟,即你可以指定闹钟触发的特定时间。它会在设备进入低功耗模式时仍然触发闹钟。但是,如果你的应用程序在后台运行并且设备处于省电模式,则可能不会触发闹钟。setExact(long triggerAtMillis, PendingIntent operation):这个方法也用于设置精确的闹钟,与setExactAndAllowWhileIdle方法类似,允许你指定特定的触发时间。但是,它不会在设备处于低功耗模式时触发闹钟。如果你的应用程序在后台运行并且设备处于省电模式,则闹钟可能会被延迟执行。setAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation):这个方法允许你设置具有弹性的触发时间的闹钟,以适应设备的省电模式。它提供了三种可能的触发类型:ELAPSED_REALTIME_WAKEUP、RTC_WAKEUP或RTC。它会在设备处于低功耗模式时仍然触发闹钟。
需要注意的是,如果 targetSdkVersion >= 33,且在 Android14 设备上没有显式申请该权限,调用上面的3个方法,则会抛出一个 SecurityException 异常
不过Android13新增android.permission.USE_EXACT_ALARM,用了模拟机的Android13版本测试,如果不写android.permission.USE_EXACT_ALARM还是会出现上面的错误
所以最终做法,就是2个权限android.permission.SCHEDULE_EXACT_ALARM和android.permission.USE_EXACT_ALARM都申请才不会有问题,这里推荐权限申请框架可以使用getActivity/XXPermissions: Android 权限请求框架,已适配 Android 14这个开源库
应该是setExact方法的限制稍微松一些吧,上面的方法可以使用,不过实际没有太高精度要求,只使用setExact应该也能达到效果
像上述的app,只是在第二日凌晨进行通知栏的数据更新(类似每日提醒那种感觉)
至于保活方面,高版本的Android限制太多,产品也没有其他要求,就先这样,只要app后台没被杀死,每日通知还是有的
不过看了其他文章,说到:
日历或闹钟应用需要在应用停止运行时发送日历提醒、唤醒闹钟或提醒。这些应用可以请求
USE_EXACT_ALARM常规权限。系统将在安装时授予USE_EXACT_ALARM权限,拥有此权限的应用将能够像具有 SCHEDULE_EXACT_ALARM 权限的应用一样设置精确闹钟。
参考
- 默认拒绝设定精确的闹钟 | Android 开发者 | Android Developers
- 记录一次android12的精准闹钟崩溃的处理 - 掘金
- Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么? - 掘金
Android12版本闹钟服务崩溃问题的更多相关文章
- C++后台服务崩溃堆栈日志
C++后台服务崩溃堆栈日志 C/C++后台服务运行过程中总会出现一些不容易重现的崩溃故障,由于重现频率低,同时运行在服务器上,导致无法调试,此外服务直接崩溃,常规日志无法截获到有用信息,这时如果能够保 ...
- pm2 服务崩溃 Error: bind EADDRINUSE
pm2 服务崩溃 Error: bind EADDRINUSE 发布于 1 年前 作者 zhujun24 2444 次浏览 来自 问答 Error: bind EADDRINUSE 0.0.0 ...
- spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...
- 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数
1 案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...
- spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...
- 关于kafka客户端版本与服务端版本不一致导致的一次坑
上周开发了一个功能,需要使用kafka接上游数据并入库,本地开发时,自己安装了一个kafka服务,开发测试时使用本地的kafka服务给主题发消息,然后在自己本地的代码中进行调试.使用的kafka版本如 ...
- AlarmManager(闹钟服务)
1.Timer类与AlarmManager类区别: 对Timer就是定时器,一般写定时任务的时候 肯定离不开他,但是在Android里,他却有个短板,不太适合那些需要长时间在后台运行的 定时任务,因为 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 外部服务调用、内部服务调用优化,面向服务化的
现在的信息系统越来越复杂,越来越庞大,不仅需要内部是一个整体,而且还需要提供很多对外的服务调用. 1:别人如何调用最方便?用不同的开发语言调用.例如app.手持设备.服务器.2:服务的返回状态是什么样 ...
- 在Centos环境下安装兼容Apache2.4高版本SVN服务
在阿里云Centos环境下,搭建PHP运行环境,PHP选择了php7版本,Mysql选择了5.7版本,Apache选择了2.4版本,在搭建SVN版本控制服务过程中出现了不兼容问题,当前环境下Apach ...
- 遇到问题----mongodb-----mongorestore报错too many open files甚至mongo服务崩溃
之前运行mongorestore还原mongodb数据库一直都没问题,今天还原的时候 报错too many open files.而且mongo服务经常崩溃需要重启. 问题有两方面: 原因一 一个原因 ...
随机推荐
- 大怨种的pwn的wp
0x01 pwnable_echo1 军训几天加暑假的活 from pwn import * context(os='linux', arch='amd64', log_level='debug') ...
- DDD实践:实现基于快照机制的变更追踪
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 去年我们在重构项目中落地了DDD,当时花了点时间研究了下阿里巴巴大淘宝技术发布的<阿里技术专家详解 ...
- shell编程之存储读写测试实战脚本
Shell编程是一种在命令行环境中编写程序的技术,常用于Linux和Unix系统.它主要使用Shell脚本语言来编写程序.Shell编程常用于系统管理.自动化任务.批处理等领域. 常用的Shell脚本 ...
- LeetCode952三部曲之三:再次优化(122ms -> 96ms,超51% -> 超91%)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<LeetCode952三部曲之 ...
- Ipa打包并安装到iphone
手动运行篇: 在真机上运行appium会进行闪退,因为我们的真机是不合法的真机,怎么样才能合法呢,要注册我们的设备才行 要对app进行打包,要先进行签名,要签名,就需要证书,证书可以自己伪造,但是这一 ...
- kmp的简单应用
Smiling & Weeping ---- 我只为你一个人写过月亮 题目链接:P4824 [USACO15FEB] Censoring S - 洛谷 | 计算机科学教育新生态 (luogu. ...
- pyinstall打包相对路径问题
pyinstall打包相对路径问题 pyinstaller 打包py文件成exe文件,在没有python的机器上运行,执行打包后的程序,经常会出现程序使用的图标无法显示,程序使用的关联文件无法关联 ...
- 编译nw-node版本的插件
编译nw-node版本的插件 下载nwjs对应版本的nodejs 原始源码目录 yh@yh:~/addon$ tree . ├── addon.cc ├── binding.gyp ├── CppLi ...
- Oracle CloudWorld 2023:Safra Catz主题演讲——把客户的成功放在首要位置
Safra Catz在Oracle CloudWorld 2023的开场演讲主题是"把客户的成功放在首要位置".她强调了客户的重要性,并说大家通过合作和技术可以实现几乎一切.她感谢 ...
- DotNetGuide新增C#/.NET/.NET Core充电站(让你学习不迷路)
DotNetGuide简介 记录.收集和总结C#/.NET/.NET Core基础知识.学习路线.开发实战.学习视频.文章.书籍.项目框架.社区组织.开发必备工具.常见面试题.面试须知.简历模板.以及 ...