На какой запрос отвечает мой onReceive? - PullRequest
2 голосов
/ 20 февраля 2011

У меня есть ArrayList контактов, который содержит номер телефона и поле состояния. Я хочу обновить поле состояния при успешном результате отправки.

Я даже пытался передать индекс элемента ArrayList в ожидающий объект с помощью contacts.indexOf (c.getPhoneNumber ()) в качестве int requestCode. Я просто не могу понять, как определить, какое сообщение сообщает об успешном завершении, и обновить свой контактный элемент.

package com.example.SMS;

public class SendSMSActivity extends SMSActivity {

    private EditText smsMessageBody;
    private Button send_button;
    private SmsManager sms;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sendsmsactivity);

        setupViews();

    }

    private void setupViews() {

        smsMessageBody = (EditText) findViewById(R.id.smsText_editText1);
        broadcast_button = (Button) findViewById(R.id.sendsms_button);

        send_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (smsMessageBody.getText().toString().length() > 0 ) {
                    if (!getSendSMSApplication().getCurrentContacts().isEmpty()) {
                        sendSMSLoop();
                        Toast.makeText(getBaseContext(), R.string.messages_sent, Toast.LENGTH_SHORT).show();
                        getSendSMSApplication().setCurrentContacts(null);  //  Clear existing contacts after send
                        finish();
                    } else {
                        Toast.makeText(getBaseContext(), R.string.error_no_numbers, Toast.LENGTH_SHORT).show();
                    }   //  there are phone numbers to send to?
                } else {
                    Toast.makeText(getBaseContext(), R.string.error_no_message, Toast.LENGTH_SHORT).show();
                }   //  user entered a message?
            }
        });

    }

    protected void sendSMSLoop() {

        ArrayList<ContactItem> contacts = getSendSMSApplication().getCurrentContacts();

        for (ContactItem c:contacts) {
            sendSMS(c.getPhoneNumber().toString(), smsMessageBody.getText().toString(), contacts.indexOf(c.getPhoneNumber()));
        }

    }

    public void sendSMS(String phoneNumber, String message, int messageIndex)
    {        
        String SENT = "SMS_SENT";

        PendingIntent sentPI = PendingIntent.getBroadcast(this, messageIndex, new Intent(SENT), 0);


        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), R.string.sms_sent, Toast.LENGTH_SHORT).show();
                    break;
                }
            }
        }, new IntentFilter(SENT));

        sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, null);

    }
}

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Я пытаюсь сделать это сам в данный момент.Я предполагаю, что у вас та же проблема, что и у меня, и если вы отправляете более 1 сообщения, они возвращают один и тот же отправленный код для всех 3 сообщений.Я думаю, что хитрость заключается в том, чтобы «пропустить» каждое сообщение, чтобы у каждого «потока» был свой код возврата.Я не могу гарантировать, что это решение, но это тот путь, по которому я собираюсь пойти дальше для решения этой проблемы.

Надеюсь, это поможет, если вы решите это, пожалуйста, дайте мне знать.

1 голос
/ 18 марта 2011

Это некоторый код, взятый из моего фактического кода:

public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
    if (bundle != null) {
        Object[] pdus = (Object[]) bundle.get("pdus");
        final SmsMessage[] messages = new SmsMessage[pdus.length];
        for (int i = 0; i < pdus.length; i++)
                messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        if (messages.length > -1) {
//The 2 variables you need (from and body)
messages[0].getOriginatingAddress();
messages[0].getMessageBody();
...

Попробуйте передать полученное / доставленное намерение этой функции (завершите функцию, чтобы добавить необходимую вам функциональность), я попробую ее вчерез несколько недель, так что дайте мне знать, как это будет, если вы победите меня.

Просто пересмотрел ваш код ...

sms.sendTextMessage(phoneNumber, null, message, sentPI, null);

Мой код выглядит примерно так:

sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);

Насколько мне известно, вам нужно добавить дополнительное намерение для работы с pdus.

...