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

如何用Broadcast Receiver接收短信?我的代码为何无日志输出?

接收短信的广播配置修正方案
  • 正确的短信接收Action:你需要把IntentFilter的Action改为android.provider.Telephony.SMS_RECEIVED,这是系统收到短信时发送的标准广播Action。

  • 必须声明的权限:在AndroidManifest.xml中添加接收短信的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

Android 6.0(API 23)及以上版本,还需要在代码中动态申请该权限(它属于危险权限)。

  • 修正后的代码示例:
class MainActivity : ComponentActivity() {
    private val REQUEST_CODE_SMS_PERMISSION = 100

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 动态申请权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS)
            != PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.RECEIVE_SMS),
                REQUEST_CODE_SMS_PERMISSION
            )
        } else {
            registerSmsReceiver()
        }

        setContent {
            Text("The app is now running")
        }
    }

    private fun registerSmsReceiver() {
        val br = MyBroadcastReceiver()
        val filter = IntentFilter("android.provider.Telephony.SMS_RECEIVED")
        // 优先级可选,数值越高越先收到广播,范围-1000到1000
        filter.priority = 1000
        val receiverFlags = ContextCompat.RECEIVER_EXPORTED

        ContextCompat.registerReceiver(
            applicationContext,
            br,
            filter,
            receiverFlags
        )
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_CODE_SMS_PERMISSION) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                registerSmsReceiver()
            }
        }
    }
}

class MyBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent?) {
        if ("android.provider.Telephony.SMS_RECEIVED" == intent?.action) {
            Log.d("qwer", "收到短信广播")
            // 可选:解析短信内容
            val bundle = intent.extras
            bundle?.let {
                val pdus = it.get("pdus") as Array<*>
                for (pdu in pdus) {
                    val smsMessage = SmsMessage.createFromPdu(pdu as ByteArray)
                    val sender = smsMessage.displayOriginatingAddress
                    val content = smsMessage.messageBody
                    Log.d("qwer", "发送方:$sender,内容:$content")
                }
            }
        }
    }
}
  • 注意事项:
    • 如果设备上设置了默认短信应用,部分厂商可能会让默认应用优先处理短信广播,甚至拦截其他应用的广播,测试时可暂时切换默认短信应用。
    • Android 12(API 31)及以上,注册导出的广播接收器需要明确指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED,你代码里的RECEIVER_EXPORTED使用是正确的。

内容的提问来源于stack exchange,提问作者VanechikSpace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:22:40