当前位置: 首页 > 知识库问答 >
问题:

收到短信息时发送多部分短信息,并检查是否送达(导致receivercall不允许例外)

太叔坚
2023-03-14

我提供以下代码,以便发送多部分短信,并检查是否送达,以回复发送方:
ExecuteCommand是接收传入短信并最终回复发送方一条短信的BroadCastReciver

   public class ExecuteCommand extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            ... 
            SendSMS s=new SendSMS(context);
            s.SendMultipartSMS(MsgBody,Number);
    }

和类SendSMSproivdeBroadcastReceiver用于发送意图,以确定发送和传递的状态为:

public class SendSMS {
    Context smscontext;
    private SmsManager smsManager;
    private BroadcastReceiver sentReceiver;
    int msgParts;

    public SendSMS(Context context) {
    smscontext = context;
}

public void SendMultipartSMS(String smsResult, String OriginatingAddress) {
    smsManager = SmsManager.getDefault();
    ArrayList<String> parts = smsManager.divideMessage(smsResult);
    msgParts = parts.size();
    final String SendNumber=OriginatingAddress;
    sentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            boolean anyError = false;
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
            case SmsManager.RESULT_ERROR_NO_SERVICE:
            case SmsManager.RESULT_ERROR_NULL_PDU:
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                anyError = true;
                break;
            }
            msgParts--;
            if (msgParts == 0) {
                context.unregisterReceiver(sentReceiver);
                Log.d("smsresiver", "send ok");

                if (anyError) {
                    Toast.makeText(context, "sending sms fail",
                            Toast.LENGTH_SHORT).show();
                    } 
            }
        }
    };
    smscontext.registerReceiver(sentReceiver, new IntentFilter(
            "CTS_SMS_SEND_ACTION"));
       Intent mSendIntent = new Intent("CTS_SMS_SEND_ACTION");


    ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();


    for (int i = 0; i < parts.size(); i++) {
        sentIntents.add(PendingIntent.getBroadcast(smscontext, 0, mSendIntent,
                0));
    }
    smsManager.sendMultipartTextMessage(
            OriginatingAddress, null, parts,
            sentIntents, null);
}

} 最后短信正确接收但发送回复短信调用接收器呼叫允许例外我认为这是由发送收件人动态寄存器接收引起的

共有1个答案

东郭瀚玥
2023-03-14

我的猜测是正确的,问题是在另一个广播接收者(这里执行命令)中注册新的意图会导致接收者呼叫允许例外我解决这个问题:

public class ExecuteCommand extends BroadcastReceiver {
       public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                if (intent.getAction()
                    .equals("android.provider.Telephony.SMS_RECEIVED")) {
                        //provide sending SMS in reply to send
                     }
                     else if (intent.getAction().equals("CTS_SMS_SEND_ACTION")) {
                        //check send and delivery of each SMS part  
                     }
 类似资料:
  • 我读过很多关于发送短信和多部分短信的帖子,如: 在Android系统中发送短信,在Android系统中发送和接收短信和彩信(pre-Kit Kat Android 4.4),Android系统PendingEvent extras,BroadcastReceiver未接收 ... 但他们似乎没有检查消息的所有部分是否成功发送。 据我所知,对于多部分消息,您可以为每个消息部分添加一个PendingE

  • 本文向大家介绍Twilio 发送短信,包括了Twilio 发送短信的使用技巧和注意事项,需要的朋友参考一下 示例 要使用Twilio和Python发送您的第一条SMS,您只需要Twilio-Python帮助程序库即可开始。            

  • 我写了一个使用短信管理器的应用程序。我使用方法,但它不起作用。现在我使用的是,这很有用。但当大约60个字符时,它会发送多部分消息。这正常吗?我读到的每一个地方都应该有160个字符。这对我很重要,因为我必须付出更多。

  • egg 发送短信逻辑 service 'use strict'; const Service = require('egg').Service; class UserService extends Service { /** * 发送验证码 */ async sendCode() { //1. 获取用户手机号 const { phone } = this

  • 问题内容: 我正在尝试从我的应用程序发送紧急短信。我必须确保SMS发送成功。 在Android系统启动后并进行检查后,将发送SMS。 因此,我有一个处理BOOT_COMPLETED意向过滤器的服务类。此类进行检查,如果内容正确,则尝试通过另一个“扩展服务”类发送SMS消息 确保成功发送短信后,两个服务(处理启动呼叫的服务和发送短信的服务)都必须退出。 问题1 :如何使我的短信发送功能在超时的情况下

  • 本文向大家介绍Android接收和发送短信处理,包括了Android接收和发送短信处理的使用技巧和注意事项,需要的朋友参考一下 关于短信接收处理方面,当前已经有一些app做的比较好了,比如发给手机发验证码验证的问题,很多app在手机接收到验证码后,不需要输入,就直接可以跳过验证界面,这就是用到了对接收到的短信的处理。至于短信的发送,也没什么好说的了。在此也只是附上一个小实例。 效果图: MainA