Android 14中如何通过后台服务读取SMS?真机适配问题求助
解决Android 14真机无法接收SMS的适配问题
针对你遇到的API 35模拟器正常、Android 14真机无响应的问题,核心是Android 14对SMS接收和后台服务的限制更严格,结合厂商定制规则,按以下步骤排查修复:
1. 补充Android 14专属权限声明
在AndroidManifest.xml中添加前台服务处理SMS的专属权限,同时确保基础权限齐全:
<!-- 基础SMS权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!-- Android 14新增:前台服务处理SMS必须声明 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SMS" /> <!-- 前台服务与通知权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
2. 修正动态权限申请逻辑
Android 14要求所有敏感权限必须动态申请,确保用户授予RECEIVE_SMS、READ_SMS、POST_NOTIFICATIONS权限后再启动服务:
private const val PERMISSION_REQUEST_CODE = 1001 private fun requestRequiredPermissions() { val permissions = arrayOf( Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS, Manifest.permission.POST_NOTIFICATIONS ) if (ActivityCompat.checkSelfPermission(this, permissions[0]) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, permissions[1]) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, permissions[2]) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE) } else { startSmsProcessingService() } } // 权限申请回调 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == PERMISSION_REQUEST_CODE && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { startSmsProcessingService() } }
3. 调整广播接收器优先级
你设置的Int.MAX_VALUE优先级可能触发系统拦截,改为系统推荐的高优先级值:
// 替换原优先级设置 intentFilter.priority = Telephony.Sms.Intents.SMS_RECEIVED_ACTION_PRIORITY_HIGH
4. 修复接收器注册的异常捕获
在Service中注册接收器时添加权限异常捕获,排查是否因权限缺失导致注册失败:
if (smsReceiver == null) { smsReceiver = SmsReceiver() val intentFilter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION) intentFilter.priority = Telephony.Sms.Intents.SMS_RECEIVED_ACTION_PRIORITY_HIGH try { registerReceiver(smsReceiver, intentFilter) Log.d(TAG, "SMS receiver registered successfully") } catch (e: SecurityException) { Log.e(TAG, "Failed to register SMS receiver: missing RECEIVE_SMS permission", e) } }
5. 跳过WorkManager直接验证服务启动
WorkManager的后台调度可能被Android 14限制,先跳过它直接启动服务,验证基础功能是否正常:
private fun startSmsProcessingService() { // 替换原WorkManager逻辑,直接启动服务 SmsProcessingService.startService(this) val prefs = getSharedPreferences("app_prefs", Context.MODE_PRIVATE) prefs.edit().putBoolean("service_initialized", true).apply() }
6. 配置真机厂商后台白名单
Android 14真机厂商(小米、华为、OPPO等)有独立的后台管控规则,必须手动添加白名单:
- 小米:设置→应用设置→你的应用→权限管理→自启动(开启)、后台活动(允许)、电池优化(无限制)
- 华为:设置→应用和服务→应用管理→你的应用→权限管理→自启动管理(允许)、电池优化(不允许)
- OPPO/一加:设置→应用→你的应用→权限管理→自启动(允许)、后台耗电管理(允许)
7. 验证前台服务状态
确保前台服务的通知在真机上正常显示(Android 14要求前台服务必须展示可见通知),如果通知未出现,检查createNotificationChannel和startForeground的逻辑是否正确。
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

