You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:37:31