gpt4 book ai didi

java - SmsReceiver onReceive 后短信消失

转载 作者:行者123 更新时间:2023-12-02 08:56:18 27 4
gpt4 key购买 nike

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

1) 每条新短信我都会收到 2 个 onReceive 调用

2) 退出 onReceive call 后短信从手机中删除。我只能通过此 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 ( Activity 默认 SMS 应用程序监听器)和 SMS_RECEIVED (被动短信监听器)操作。您的接收者不会检查您的 Intent 是什么。我建议删除 SMS_RECEIVED 操作。

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

建议的做法是使用 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);

关于java - SmsReceiver onReceive 后短信消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60466107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com