首页 > 解决方案 > Android电话短信接收器不工作

问题描述

我正在开发一个应用程序来侦听特定的 SMS 通知,然后在其上生成一些分析数据。我无法接收任何传入的 SMS 消息,如果我错过了什么或做错了什么,请帮忙

清单文件

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

<receiver android:name=".SmsReceiver">
    <intent-filter>
      <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

短信接收器类

package com.example.sms_project;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import android.widget.Toast;

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
            Toast.makeText(context, "Message received from SMS", Toast.LENGTH_SHORT).show();
        }
    }
}

收到的任何短信都不会触发 Toast,请帮忙

标签: javaandroid

解决方案


你应该添加到manifiest这个权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> ,如果仍然不工作,试试这个代码:

class SMSBroadcastReceiver : BroadcastReceiver() {
    var listenerSMS: ((String, String) -> Unit)? = null

    fun setOnIncomeSmsDetectListener(f: ((String, String) -> Unit)) {
        listenerSMS = f
    }

    val sms = SmsManager.getDefault()
    override fun onReceive(context: Context?, intent: Intent?) {
        val bundle = intent?.extras

        try {
            if (bundle != null) {
                val pdusObj = bundle.get("pdus") as Array<*>
                for (i in pdusObj.indices) {
                    val currentMessage = SmsMessage.createFromPdu(pdusObj[i] as ByteArray)
                    val phoneNumber = currentMessage.getDisplayOriginatingAddress()
                    val message = currentMessage.getDisplayMessageBody()
                    listenerSMS?.invoke(phoneNumber, message)
                    Log.i("SmsReceiver", "senderNum: $phoneNumber; message: $message")
                }
            }

        } catch (e: Exception) {
            Log.e("SmsReceiver", "Exception smsReceiver$e")
        }
    }
}

推荐阅读