1

SMSを送信する方法があります。このメソッドは、送信レポートと配信レポートを受け取る 2 つの保留中のインテントを登録します。

最初のメッセージを送信し、その送信レポートと配信レポートを受信して​​から、別のメッセージを送信します。2 番目のメッセージのレポートを受信して​​いるときに、最初のメッセージと 2 番目のメッセージのレポートを受け取ります。別のメッセージを送信すると、1 番目と 2 番目のメッセージのレポートを受け取り、次に 3 番目のメッセージのレポートを受け取ります。

どうしたの?

ソース:

public void sendSms(String phoneNumber, String cmd ...) {
    sentPI      = PendingIntent.getBroadcast(this, sendSmsCounter++, new Intent(SENT),      PendingIntent.FLAG_CANCEL_CURRENT);
    deliveredPI = PendingIntent.getBroadcast(this, deliverCounter++, new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT);

    sendingBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    displayMessage("Sms Sent");
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    displayMessage("Sending SMS error: Generic failure");
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    displayMessage("Sending SMS error: No service");
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    displayMessage("Sending SMS error: Null PDU");
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    displayMessage("Sending SMS error: Radio off");
                    break;
            }               
        }
    };


    this.registerReceiver(sendingBroadcastReceiver, new IntentFilter(SENT));

    deliveryBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
           switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    displayMessage("SMS Delivered");
                    break;
                case Activity.RESULT_CANCELED:
                    displayMessage("SMS delivery error: SMS Canceled");
                    break;                        
            }               
        }
    };

    this.registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED));

    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, cmd, sentPI, deliveredPI);        
4

3 に答える 3

2

この問題は、OnReceive() メソッドの最後に次の行を追加することで解決されます。

 MyActivity.this.unregisterReceiver(this);

詳しく見る:

sendingBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        switch (getResultCode())
        {
            case Activity.RESULT_OK:
                displayMessage("Sms Sent");
                break;
            // ...    
        }
        MyActivity.this.unregisterReceiver(this);               
    }
};

ブロードキャストを受信して​​処理すると、このブロードキャスト レシーバーは不要になるため、Activity から登録を解除します。

于 2012-05-04T17:01:08.040 に答える
2

このコードを使用して、送信された通知を送受信します

send.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            String phoneNo = "Phone number";
            String message = "Content of the msg";
            if (phoneNo.length() > 0 && message.length() > 0) {
                TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                int simState = telMgr.getSimState();
                switch (simState) {
                case TelephonyManager.SIM_STATE_ABSENT:
                    displayAlert();
                    break;
                case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
                    // do something
                    break;
                case TelephonyManager.SIM_STATE_PIN_REQUIRED:
                    // do something
                    break;
                case TelephonyManager.SIM_STATE_PUK_REQUIRED:
                    // do something
                    break;
                case TelephonyManager.SIM_STATE_READY:
                    // do something
                    sendSMS(phoneNo, message);
                    break;
                case TelephonyManager.SIM_STATE_UNKNOWN:
                    // do something
                    break;
                }

            } else {
                Toast.makeText(getBaseContext(),
                        "Please enter both phone number and message.",
                        Toast.LENGTH_SHORT).show();
            }

        }



private void sendSMS(String phoneNumber, String message) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

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

    PendingIntent deliveredPI = PendingIntent.getBroadcast(YourActivity.this,
            0, new Intent(DELIVERED), 0);

    // ---when the SMS has been sent---

    registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(YourActivity.this, "SMS sent",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(YourActivity.this, "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(YourActivity.this, "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(YourActivity.this, "Null PDU",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;

            }
        }
    }, new IntentFilter(SENT));

    // ---when the SMS has been delivered---
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(YourActivity.this, "SMS delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(YourActivity.this, "SMS not delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }, new IntentFilter(DELIVERED));

    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    Intent smsintent = new Intent(YourActivity.this, SecondActivity.Activity);
    startActivity(smsintent);
}
于 2012-04-30T13:49:18.990 に答える
0

これをonPauseに入れましたか?

@Override
    protected void onPause() {
        super.onPause();
        if (bRSMS_has_been_sent != null){
            unregisterReceiver(bRSMS_has_been_sent);
            bRSMS_has_been_sent = null;
        }
        if (brSMS_has_beed_delivered != null){
            unregisterReceiver(brSMS_has_beed_delivered);
            brSMS_has_beed_delivered = null;
        }
    }

私の受信機はbRSMS_has_been_sentどこですかbrSMS_has_beed_delivered

受信者の登録を必ず解除してください。

自分自身を確認したい場合は、静的変数を使用して、送信メソッドを呼び出して受信側でログ出力を行うたびに値を増やしてください。このようにして、どのレシーバーが実際に起動されるかを確認できます。すべてのレシーバーを登録し、どれも登録解除しないと、いくつかのレシーバーが起動されるはずです。

于 2012-04-30T13:48:49.990 に答える