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服务经常崩溃需要重启. 问题有两方面: 原因一 一个原因 ...
随机推荐
- Linux系统远程拷贝命令:scp
做个记录,首先两台机器间要互通. 1. 将本地服务器的文件夹/文件拷贝到远程服务器上 语法: scp -r -P port local_folder/remote_file remote_userna ...
- PE文件结构2(实现PE文件载入)
现在我们已经学完了PE文件格式,但是尚还停留在纸上谈兵的阶段,作为Windows系统上的可执行文件格式,PE文件结构总是和结构体,指针等紧密联系在一起的.理解它的最好方法就是通过写一个类似LordPE ...
- Programming abstractions in C阅读笔记:p127-p129
<Programming Abstractions In C>学习第51天,p127-p129,总结如下: 一.技术总结 1. string library 掌握常用函数如strlen,s ...
- Python 基础面试第三弹
1. 获取当前目录下所有文件名 import os def get_all_files(directory): file_list = [] # os.walk返回一个生成器,每次迭代时返回当前目录路 ...
- API数据接口的应用步骤
API(Application Programming Interface)是现代软件应用程序开发中的一项重要技术,它允许不同的应用程序之间进行通信和数据交换.API接口通过提供统一的访问点,使得应用 ...
- 入门篇-其之一-第一个Java程序
️注意: 本文中包含实际操作,需要安装JDK.如果需要安装JDK,请按照这篇文章的步骤进行安装:点我查看JDK安装教程 小白可以多看几遍这篇文章,多敲几次代码 前面我们已经安装了JDK,接下来就是写一 ...
- 弹性数据库连接池探活策略调研(三)——DBCP
前言 在之前的文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP.Druid连接池探活策略的相关内容.在本文中,我们将会继续探讨另一个线上常用的连接池--DBCP,并为您介绍如何在使 ...
- Solution -「YunoOI 2017」由乃的 OJ
Description Link. 起床困难综合症 上树. Solution 线段树维护,树剖上树. 具体题解有空再写,我要去睡觉了. #include<bits/stdc++.h> ty ...
- Journey -「CQOI 2021」
Day -1 Thu. & Fri. 恰逢学校运动会,于是向班主任申请了不去,然后就在机房坐着.不美好的事情可能就是文化课老师还留了这两天的作业,不过-> 一旦放弃了作业,什么都好说了呢 ...
- [自然语言处理] 基于pycorrector实现文本纠错
文本纠错(Text Error Correction)技术旨在自动修正输入文本中的拼写.语法.标点符号等错误,以提高文本的准确性.通顺性和规范性.该技术可以通过自然语言处理技术实现,基于上下文和语言规 ...