Delphi开发Android App开启推送通知后无法启动(API>30)求助
解决方案:API 30+ 推送权限适配导致应用启动崩溃问题
核心原因
Android 11(API 30)开始,POST_NOTIFICATIONS 权限不再自动授予,改为运行时权限。如果应用在启动阶段未获取该权限就直接执行通知相关操作(如创建通知渠道、初始化推送SDK),会触发权限异常导致崩溃。
具体修复步骤
1. 清单文件添加权限声明
在AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- 保留原有推送相关基础权限(如网络、唤醒锁) --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" />2. 启动时先检查并申请权限
在应用第一个启动的Activity中,先确认通知权限状态,未授权则发起申请,避免在权限未确认前执行通知相关逻辑:// Kotlin 示例 private val requestNotificationPermission = registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted -> if (isGranted) { // 权限授予后再初始化推送服务、创建通知渠道 initPushService() } else { // 权限拒绝时,处理无通知权限的场景(如禁用推送功能) disablePushFunctionality() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission( this, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { requestNotificationPermission.launch(Manifest.permission.POST_NOTIFICATIONS) } else { initPushService() } } else { // API <33 无需申请,直接初始化推送 initPushService() } }3. 升级第三方推送SDK版本
如果使用第三方推送服务(如Firebase Messaging、极光推送等),必须升级到适配API 30+的版本:- Firebase Messaging:升级至
23.0.0及以上 - 极光推送:升级至
JPush 4.0.0及以上
旧版本SDK未处理新权限逻辑,会在启动时直接调用通知API引发崩溃。
- Firebase Messaging:升级至
4. 排查崩溃日志定位问题
如果上述步骤无效,提取崩溃日志(通过Android Studio Logcat或崩溃统计工具查看),重点关注SecurityException或通知相关异常,定位到具体代码行后针对性修复。
内容的提问来源于stack exchange,提问作者Gebhard Blank
相关产品推荐
相关产品推荐

