如何用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
相关产品推荐
相关产品推荐

