SmsManager:从BroadcastReceiver获取消息收件人电话号码

时间:2016-06-12 18:16:03

标签: android rx-java rx-android smsmanager

我向多个收件人发送邮件的方式如下:

public void send(List<User> participants,
                 Func1<User, String> messageTextCallback,
                 Subscriber<SendingProgress> subscriber) { // TODO: throw error
    Observable<SendingProgress> observable = Observable.create(sub -> {
        String unequalSmsSentAction = UUID.randomUUID().toString();

        context.registerReceiver(new BroadcastReceiver() {
            private int totalToSend = participants.size();
            private int sentCounter = 0;

            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        sub.onNext(
                                new SendingProgress(totalToSend, ++sentCounter)
                        );
                        if(sentCounter == totalToSend) {
                            sub.onCompleted();
                            context.unregisterReceiver(this);
                        }
                        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:
                        subscriber.onError(new SendSmsException());
                        sub.onCompleted();
                }
            }
        }, new IntentFilter(unequalSmsSentAction));

        int totalToSend = participants.size();
        for(int i = 0; i < totalToSend; i++) {
            User participant = participants.get(i);
            logger.d(TAG, "sending to: " + participant.getUsername());
            PendingIntent sentPi = PendingIntent.getBroadcast(context, 0, new Intent(unequalSmsSentAction), 0);
            smsManager.sendTextMessage(
                    participant.getPhones().get(0),
                    null,
                    messageTextCallback.call(participant),
                    sentPi,
                    null
            );
        }
    });

    observable
            .subscribeOn(ioScheduler)
            .observeOn(mainThreadScheduler)
            .subscribe(subscriber);
}

此代码为每个用户的电话号码调用SmsManager.sendTextMessage(...)

BroadcastReceiver收到每封已发送的邮件,并通知订阅者。我想在BroadcastReceiver.onReceive内获取短信收件人的电话号码,以便通过SendingProgress

有没有办法做到这一点? 我应该同步发送多条短信吗?

1 个答案:

答案 0 :(得分:1)

  

有没有办法做到这一点?

第1步:将您想要的信息添加到unequalSmsSentAction Intent

的额外内容中

步骤2:为每个PendingIntent使用唯一ID(getBroadcast()来电的第二个参数,0 - 将其替换为每条短信的不同值)

第3步:阅读Intent发送到BroadcastReceiver

的额外信息

但是,任何应用都可以收听您的unequalSmsSentAction广播。理想情况下,将Intent中的额外值设置为可用于查找电话号码的内容,但接收这些广播的任何其他应用都无法使用该值。

  

我应该同步发送多条短信吗?

AFAIK,你不能同步发送它们。