SMS によるテキストメッセージの送信 - 送信済み状態の取得

SMS によるテキストメッセージの送信」では単純にテキストメッセージを送信しました。

一般的に言って、こうしたメッセージの送信などのように、ひとつのアプリケーション内に閉じていないプログラムを開発するときは、 エラーのハンドリングに十分注意を払う必要があります。

この場合もエラーが発生する原因は様々です。

ここではその送信が正常に実施されたかどうか確認する方法について説明します。

テキストメッセージの送信確認

送信済みになったかどうかという情報は、ブロードキャストで返ります。

次のコードをみてください。ちょっとコード量が増えましたが、 基本的に 「SMS によるテキストメッセージの送信」と同様です。

ポイントは SmsManager の sendTextMessage メソッドを呼んだ時に、ペンディングインテントを渡している点です。

package com.example.sms2;

import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

  final String ACTION_SENT = "com.example.sms2.ACTION_SENT";
  PendingIntent sentIntent;
  SMSSentBroadcastReceiver sentBroadcastReceiver;
  Button sendButton;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    sentIntent = PendingIntent.getBroadcast(
      this, 0, new Intent(ACTION_SENT), 0);
    
    sendButton = (Button)findViewById(R.id.sendButton);
    sendButton.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View v) {
        SmsManager smsManager = SmsManager.getDefault();
        String destinationAddress = "1234567890";
        String scAddress = null;
        String text = "Hello!";
        
        smsManager.sendTextMessage(
          destinationAddress,
          scAddress,
          text,
          sentIntent,
          null);
      
      }
    });
  }
  
  
  @Override
  protected void onPause() {
    super.onPause();
    unregisterReceiver(sentBroadcastReceiver);
  }
  
  
  @Override
  protected void onResume() {
    super.onResume();
    
    sentBroadcastReceiver = new SMSSentBroadcastReceiver();
    registerReceiver(sentBroadcastReceiver, 
      new IntentFilter(ACTION_SENT));
  }
  
  
  class SMSSentBroadcastReceiver extends BroadcastReceiver {
  
    @Override
    public void onReceive(Context context, Intent intent) {
      switch(getResultCode()){
      case Activity.RESULT_OK:
        Toast.makeText(getBaseContext(), 
          "SMS Sent", Toast.LENGTH_SHORT).show();
        break;
      case Activity.RESULT_CANCELED:
        Toast.makeText(getBaseContext(), 
          "SMS Canceled", Toast.LENGTH_SHORT).show();
        break;
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
        Toast.makeText(getBaseContext(), 
          "Generic Failure", Toast.LENGTH_SHORT).show();
        break;
      case SmsManager.RESULT_ERROR_NO_SERVICE:
        Toast.makeText(getBaseContext(), 
          "No Service", Toast.LENGTH_SHORT).show();
        break;
      case SmsManager.RESULT_ERROR_NULL_PDU:
        Toast.makeText(getBaseContext(), 
          "NULL PDU", Toast.LENGTH_SHORT).show();
        break;
      case SmsManager.RESULT_ERROR_RADIO_OFF:
        Toast.makeText(getBaseContext(), 
          "Radio Off", Toast.LENGTH_SHORT).show();
        break;
      }
    }
    
  }
  

ペンディングインテントというのは、ステータス通知ブート時のスケジューリング などでも出てきましたね。

後で何かをやりたいというような場合に、その情報を詰め込んでおくものです。

ここではブロードキャストを行うペンディングインテントを、PendingIntent.getBroadcast メソッドで作成し、それを sendTextMessage メソッドに渡しておきます。

すると、送信が完了したときにブロードキャストが行われ、そのレシーバを設定しておけばそこで結果が取れるというわけです。

尚、ブロードキャストについては ブロードキャストレシーバの実装によるアクティビティとサービスの通信 なども参考にしてください。 コールバック的だったり、複数のコンポーネントが互いに関わりあうときに使われます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門