阅读短信不起作用

Reading SMS not working

我写了下面的方法来读取传入的短信文本。此代码在 Android 4.04 中完美运行,当默认 SMS 客户端是本机 SMS 客户端时,但当 SMS 客户端是 Hangout 时,该方法不起作用。

同样的方法在Android 5 以环聊为短信客户端时有效,问题仅在Android 4.04 以环聊为短信客户端。如果我遗漏了什么,请告诉我。

static boolean readSMS(Intent intent, int code) {
    try {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdusObj = (Object[]) bundle.get("pdus");
            for (int i = 0; i < pdusObj.length; i++) {
                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                String message = currentMessage.getDisplayMessageBody();
                if (message.contains(String.valueOf(code)))
                    return true;
            }
        }
    } catch (Exception e) {
        return false;
    }
    return false;
}

该方法是从 BroadCastReceiver 中的 java 代码调用的。

     receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                     if (readSMS(intent, code)) {
                    ------------------
                    }
                }

BroadCastReceiver 被调用为:

   context.registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

Manifest.xml

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

传入的短信是一个 Broadcast transmission,您可以注册一个 receiver 来收听它并根据您的逻辑进行回复。可以注册多个接收者到短信广播,他们都会按照一定的顺序,一个接一个的收到短信。
我们怎么知道顺序呢?每个接收者都有一个 priority,OS 将 SMS 从优先级较高的接收者发送到较低的接收者。
Android 4.4(不包括)之前,您可以使用 abortBroadcast(); 语句来终止调度。假设我们有两个应用程序——A 和 B,带有 SMS 接收器。如果 A 的优先级高于 B,并且 A 使用了 abort 语句,那么应用 B 将永远不会收到短信。从 Android 4.4 开始,您将无法再中止 SMS 传输。
从你的问题来看,当你使用 Android 4.0.4 时,环聊客户端在你的应用程序中具有更高的优先级,并且它会中止广播传输,而默认客户端不会中止它(或具有较低的优先级)。当您切换到 Android 5 时,环聊无法中止短信,因此您的应用可以正常运行。
至于优先级 - documentation 声明“该值必须是整数,例如“100”。数字越大,优先级越高。默认值为 0。该值必须更大小于 -1000 且小于 1000.".
您可以将

这一行添加到您的 menifanifest
<intent-filter android:priority="999">

并希望环聊的优先级较低。