首页 > 其他分享 >Android12版本闹钟服务崩溃问题

Android12版本闹钟服务崩溃问题

时间:2023-12-06 17:33:36浏览次数:51  
标签:闹钟 Android12 ALARM 版本 calendar EXACT Calendar android

原文地址: Android12版本闹钟服务崩溃问题 - Stars-One的杂货小窝

公司项目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_WAKEUPRTC_WAKEUPRTC。它会在设备处于低功耗模式时仍然触发闹钟。

需要注意的是,如果 targetSdkVersion >= 33,且在 Android14 设备上没有显式申请该权限,调用上面的3个方法,则会抛出一个 SecurityException 异常

不过Android13新增android.permission.USE_EXACT_ALARM,用了模拟机的Android13版本测试,如果不写android.permission.USE_EXACT_ALARM还是会出现上面的错误

所以最终做法,就是2个权限android.permission.SCHEDULE_EXACT_ALARMandroid.permission.USE_EXACT_ALARM都申请才不会有问题,这里推荐权限申请框架可以使用getActivity/XXPermissions: Android 权限请求框架,已适配 Android 14这个开源库

应该是setExact方法的限制稍微松一些吧,上面的方法可以使用,不过实际没有太高精度要求,只使用setExact应该也能达到效果

像上述的app,只是在第二日凌晨进行通知栏的数据更新(类似每日提醒那种感觉)

至于保活方面,高版本的Android限制太多,产品也没有其他要求,就先这样,只要app后台没被杀死,每日通知还是有的

不过看了其他文章,说到:

日历或闹钟应用需要在应用停止运行时发送日历提醒、唤醒闹钟或提醒。这些应用可以请求 USE_EXACT_ALARM 常规权限。系统将在安装时授予 USE_EXACT_ALARM 权限,拥有此权限的应用将能够像具有 SCHEDULE_EXACT_ALARM 权限的应用一样设置精确闹钟。

参考

标签:闹钟,Android12,ALARM,版本,calendar,EXACT,Calendar,android
From: https://www.cnblogs.com/stars-one/p/17808026.html

相关文章

  • DevExpress 各版本破解方法
    如果是首次安装Dev只需要下面两步流程就可以 第一步安装试用的最新版Devexpress22.2.4这步看直接去官网,安装官方试用的就可以第二步安装破解补丁关闭防火墙或360然后打开DevExpress.Universal.Patch选择22.2版本和对应的visualstudio的版本.(如visualstudio2022c......
  • Maven多模块项目版本统一管理
    如图所示,项目中定义了这样几个模块:pdd-workflow-build:定义项目版本,及全局配置pdd-workflow-dependencies:外部依赖管理,统一管理所有用到的外部依赖的版本pdd-workflow-service:项目service模块pdd-workflow-web:项目web模块pdd-parent:聚合模块模块之间的继承依赖关系如......
  • 【backward解决方案与原理】网络模型在梯度更新时出现变量版本号机制错误
    【backward解决方案与原理】网络模型在梯度更新时出现变量版本号机制错误报错详情错误产生背景原理解决方案RuntimeError:oneofthevariablesneededforgradientcomputationhasbeenmodifiedbyaninplaceoperation报错详情  模型在backward时,发现如下报错......
  • electron项目同一壳版本号(目录)实现安装信息和内容不同(少量不同)
    一、通过electron层的scripts中的build.nsi文件修改安装生成的set.ini文件内容SetShellVarContextall/*把当前安装包的名字写入set.ini,便于程序读取并设置{setupname}参数*/IfFileExists"$INSTDIR\set.ini"0file_not_foundWriteINIStr"$INSTDIR\R......
  • 最新版本——Hadoop3.3.6单机版完全部署指南
    大家好,我是独孤风,大数据流动的作者。本文基于最新的Hadoop3.3.6的版本编写,带大家通过单机版充分了解ApacheHadoop的使用。本文更强调实践,实践是大数据学习的重要环节,也能在实践中对该技术有更深的理解,所以一些理论知识建议大家多阅读相关的书籍(都在资料包中)。本文档版权......
  • KubeKey 升级 KubeSphere 和 Kubernetes 补丁版本实战指南
    作者:运维有术前言知识点定级:入门级KubeKey如何升级KubeSphere补丁版本KubeKey如何升级Kubernetes补丁版本KubeSphere和Kubernetes升级准备及验证KubeKey升级KubeSphere和Kubernetes的常见问题实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)......
  • CentOS7升级内核版本,以及解决升级内核后网卡不能使用的问题
    CentOS7.9自带的内核版本为3.1,没有wireguard模块,遂决定升级内核版本 第一步升级内核,参考https://www.cnblogs.com/iwalkman/p/9736856.html 除了内核还需要安装kernel-ml-devel,否则待会编译网卡驱动会报错yum--enablerepo=elrepo-kernelinstallkernel-ml-devel 我......
  • nginx版本升级之rpm包-nginx 安全漏洞(CVE-2021-23017)
    nginx安全漏洞(CVE-2021-23017) 原版本nginx-1.19.6-1.el7.ngx.x86_64.rpm 要升级的版本nginx-1.20.1-1.el7.ngx.x86_64.rpm1.下载nginx-1.20.1-1.el7.ngx.x86_64.rpm官网下载地址http://nginx.org/packages/rhel/7/x86_64/RPMS/ 2.安装rpmrpm-Uvhnginx-1.20.1......
  • .Net各版本的区别
    简介:.NET是一个跨平台的开发框架,它提供了一系列工具和库,用于开发各种类型的应用程序。在不同的.NET版本之间,存在一些区别和改进。下面是几个常见的.NET版本及其主要区别的概述:.NETFramework:.NETFramework是最早发布的.NET版本,它主要用于Windows桌面应用程序和We......
  • IntelliJ IDEA 2023 又出新版本啦!最新IDEA激活码安排上「永久激活,长期更新,亲测有效」
    IntelliJIDEA2023又出新版本啦IntelliJIDEA2023又出新版本啦!上一个版本还没用熟练,2023.2.5版本就出来了。还好是小版本发布,使用上没有太多影响。IntelliJIDEA是一款功能强大的集成开发环境,被广泛应用于Java开发中。为了充分发挥其优势,您需要激活码来解锁全部功能。本文将......