【问题标题】:How can I send an SMS from a BroadcastReceiver and check its status?如何从 BroadcastReceiver 发送 SMS 并检查其状态?
【发布时间】:2011-08-15 02:58:41
【问题描述】:

这是我的BroadcastReceiver

public class IncomingSMSListener extends BroadcastReceiver {
private static final String SMS_EXTRA_NAME = "pdus";

@Override
public void onReceive(Context context, Intent intent) {
    SmsMessage[] messages = fetchSMSMessagesFromIntent(intent);
}

private SmsMessage[] fetchSMSMessagesFromIntent(Intent intent) {
    ArrayList<SmsMessage> receivedMessages = new ArrayList<SmsMessage>();
    Object[] messages = (Object[]) intent.getExtras().get(SMS_EXTRA_NAME);
    for (Object message : messages) {
        SmsMessage finalMessage = SmsMessage
                .createFromPdu((byte[]) message);
        receivedMessages.add(finalMessage);
    }
    return receivedMessages.toArray(new SmsMessage[0]);
}

}

我能够很好地阅读传入的消息,但假设从这里我想将消息转发到另一个电话号码并确保它已发送。我知道我可以做到SmsManager.sendTextMessage(),但我如何设置PendingIntent 部分以通知短信是否发送?

【问题讨论】:

    标签: android sms broadcastreceiver android-pendingintent


    【解决方案1】:

    好的,最终找到了解决方案。由于在 BroadCastReceiver 中传递给 onReceive() 方法的上下文不允许我注册其他 BroadcastReceiver 来监听“消息发送”事件,因此我最终掌握了应用程序上下文并执行以下操作:

    在广播接收器中:

    SmsManager smsManager = SmsManager.getDefault();
        Intent intent = new Intent(SENT_SMS_FLAG);
        PendingIntent sentIntent = PendingIntent.getBroadcast(context, 0,
                intent, 0);
        SMSForwarderApp.getAppContext().registerReceiver(
                new MessageSentListener(),
                new IntentFilter(SENT_SMS_FLAG));
        smsManager.sendTextMessage("Here goes the destination of the SMS", null,
                "Here goes the content of the SMS", sentIntent, null);
    

    SENT_SMS_FLAG 只是一个静态字符串,用于唯一标识我刚刚创建的意图。我的 MessageSentListener 如下所示:

    public class MessageSentListener extends BroadcastReceiver{
    
    @Override
    public void onReceive(Context context, Intent intent) {
        int resultCode = this.getResultCode();
        boolean successfullySent = resultCode == Activity.RESULT_OK;
        //That boolean up there indicates the status of the message
        SMSForwarderApp.getAppContext().unregisterReceiver(this);
                //Notice how I get the app context again here and unregister this broadcast
                //receiver to clear it from the system since it won't be used again
    }
    

    }

    【讨论】:

    • 如果您没有取消注册 MessageSentListener 您可能会遇到多个条目,这是我面临的一个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2017-09-21
    • 2015-01-24
    • 2011-10-25
    • 2015-04-07
    相关资源
    最近更新 更多