java - 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>
解决方案
您收到 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);
推荐阅读
- c# - 找不到与兼容的“Microsoft.Azure.WebJobs”版本
- python - xlsxwriter worksheet.write_blank 适用于范围
- ios - UITableView 页脚和页眉背景颜色比指定颜色深
- c++ - 如何在我的函数中保存变量以再次使用它?
- excel - 提取2个字符之间的字符串;不同的格式
- spring-boot - ClassNotFoundException 与 springboot 中的外部库
- r - 检查每个元素等价于 1
- memory - 在命令提示符中显示 ram 使用百分比
- javascript - WebComponent 何时采用了Callback?
- excel - 不一致的 GetChartElement 返回数据