【问题标题】:Reading SMS not working阅读短信不起作用
【发布时间】:2015-07-16 14:25:57
【问题描述】:

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

同样的方法在 Android 5 中使用 Hangout 作为 SMS 客户端,问题仅在 Android 4.04 中使用 Hangout 作为 SMS 客户端。如果我遗漏了什么,请告诉我。

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" />

【问题讨论】:

    标签: android sms broadcastreceiver android-4.0-ice-cream-sandwich smsmanager


    【解决方案1】:

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

    <intent-filter android:priority="999">
    

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

    【讨论】:

    • 优先级可以设置得比这个高得多,在 Java 中达到并包括 Integer 的最大值。此外,您可以查看环聊为其接收者设置的优先级 - 它会在他们的清单中。
    • @TheoLassonder 有没有办法检查环聊清单?我认为没有办法做到这一点
    • @ɥʇᴉɾuɐɹ 我已经检查过了,它是加密的。但是尝试将 priority 行添加到您的清单并使用不同的值检查它,您没有什么可失去的。
    • @TDG 无法加密,因为系统需要读取它。此外,您可以以编程方式列出所有应用的广播接收器,包括它们的优先级
    • 如果您只是将 APK 文件视为 zip 文件并提取清单,您将获得它的编译版本。另一方面,如果您使用像 ibotpeaches.github.io/Apktoolgithub.com/lxdvs/apk2gold 这样的工具,您会得到一个解码良好的版本(以及许多其他东西)。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2013-04-17
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2020-01-30
    相关资源
    最近更新 更多