首页 > 解决方案 > SmsReceiver onReceive 后短信消失

问题描述

我正在尝试开发一个短信应用程序。当我选择此应用程序作为默认短信应用程序时,当我收到带有此 SmsReceiver 代码的新短信时,会出现以下问题:

1) 每条新短信我都会收到 2 个 onReceive 电话

2) 退出 onReceive 呼叫后从手机中删除的 SMS 消息。我只能从此 onReceive 呼叫中访问 SMS 消息,并且该消息消失后​​。

这段代码有什么问题?我是否必须运行一些代码才能保留新的短信?

public class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null && bundle.containsKey("pdus")) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdus[0]);
            String senderNumber = sms.getOriginatingAddress();
            String text = sms.getMessageBody();
            long time = sms.getTimestampMillis();
            sendNotification(context, senderNumber);
        }
    }
}

AndroidManifest.xml:

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

        <activity
            android:name=".SmsListActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SENDTO"/>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".SmsReceiver"
            android:exported="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter
                android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
                <action android:name="android.provider.Telephony.SMS_DELIVER_ACTION" />
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <receiver android:name=".MmsReceiver"
            android:exported="true"
            android:permission="android.permission.BROADCAST_WAP_PUSH">
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
                <data android:mimeType="application/vnd.wap.mms-message" />
            </intent-filter>
        </receiver>

        <service
            android:name=".QuickResponseService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </service>

标签: javaandroid

解决方案


您收到 2 个onReceive电话是因为您同时注册了SMS_DELIVER(主动默认 SMS 应用侦听器)和SMS_RECEIVED(被动短信侦听器)操作。您的接收者没有检查您的意图是什么类型的操作。我建议删除SMS_RECEIVED操作。

由于您正在开发一个默认的 SMS 应用程序,因此您负责在持久内存中保存(或丢弃)任何传入/传出消息。

推荐的做法是Telephony.Sms.Inbox在内容提供程序中使用表来执行此操作(请注意,只有默认的短信应用程序被授予写入该表的权限;任何其他具有短信权限的应用程序只能读取它):

ContentValues values = new ContentValues();
values.put(Telephony.Sms.ADDRESS, senderNumber);
values.put(Telephony.BODY, text);
context.getContentResolver().insert(Telephony.Sms.Inbox.CONTENT_URI, values);

推荐阅读