ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 メッセージの取り扱い

送信したSMSメッセージをプログラム的にモニタする

Monitoring the Status of Sent SMS Messages Programmatically

SMSメッセージをプログラム的に送っていく時に、
送信状態をモニタし、メッセージの送信と到達が実際に
できたかどうかを確認したくなるかもしれません。
送っているSMSメッセージの状態をモニタするためには、
2つのPendingIntentを使用させる必要があります。
1つはメッセージが送られたときに追跡するためのもの。
もう1つはメッセージが実際に配達されたかどうかを
追跡するものです。
BroadcastReceiverオブジェクトも2つ必要になり、
結果、SMSメッセージが送信、配達されているとき
目的に注視することができます。

package net.learn2develop.sendsmswithfeedback;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.os.Bundle;

public class MainActivity extends Activity{
  String SENT = "SMS_SENT";
  String DELIVERED = "SMS_DELIVERED";
  PendingIntent sentPI, deliveredPI;
  BroadcastReceiver smsSentReceiver, smsDeliverdReceiver;

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

ちょっと注釈

送信メッセージと配達されたメッセージの間には
何の違いがあるのでしょうか?
送信メッセージとは
送信者の電話から送信が成功しているメッセージのことで、
でも、受信者に配達されたかされていないかの状態にある
メッセージのことです。
例えば、メッセージが受信者の電話が電源が入っていないなどの理由で、
配達されなかったら、または、いくつかの理由で受信者に
メッセージが配達できなかった場合などの事です。
メッセージは電話番号の確認ができなかった場合にも
送信することができません。
(電話番号が違う書式で指定されていても送信できません。)


アクティビティのonCreate()メソッドの中で、broadcastを行う
PendingIntentオブジェクトを検索するためのPendingIntentクラスの
getBroadcast()メソッドを呼び出します。
これを2回行い、1回はPendingIntentオブジェクトを送るためのもので、
もう1回は、PendingIntentオブジェクトを配達させるためのものです。

package net.learn2develop.sendsmswithfeedback;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity{
  String SENT = "SMS_SENT";
  String DELIVERED = "SMS_DELIVERED";
  PendingIntent sentPI, deliveredPI;
  BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;

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

   sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
   deliveredPI = PendingIntent.getBroadcase(this, 0, new Intent(DELIVERED), 0);
  }
}

アクティビティのonResume()メソッドの中で、
2つのBroadcastReceiverオブジェクトを作り、
それらのonReceive()メソッドを実行します。
最初のBroadcastReceiverオブジェクトはメッセージが
成功したかどうかをチェックするもので、
一方、2番目のものはメッセージの配達が成功したかどうかを
チェックする為のものです。

package net.learn2develop.sendsmswithfeedback;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.widget.Toast;

public class MainActivity extends Activity{
  String SENT = "SMS_SENT";
  String DELIVERED = "SMS_DELIVERED";
  PendingIntent sentPI, deliveredPI;
  BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;

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

   sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
   deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
  }

  @Override
  public void onResume(){
   super.onResume();

   //---create the BroadcastReceiver when the SMS is sent---
   smsSentReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent arg1){
     switch(getResultCode()){
     case Activity.RESULT_OK:
      Toast.makeText(getBaseContext(), "SMS sent",
          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(getBaserContext(), "Radio off",
          Toast.LENGTH_SHORT).show();
      break;
     }
    }
   };

   //---create the BroadcastReceiver when the SMS is delivered---
   smsDeliveredReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent arg1){
     switch (getResultCode()){
      case Activity.RESULT_OK:
       Toast.makeText(getBaseContext(), "SMS delivered",
           Toast.LENGTH_SHORT).show();
       break;
      case Activity.RESULT_CANCELED:
       Toast.makeText(getBaseContext(), "SMS not delivered",
           Toast.LENGTH_SHORT).show();
       break;
      }
     }
   };

   //---ddddregister the two BroadcastReceivers---
   registerReceiver(smsSentReceiver, new IntentFilter(SENT));
   registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));

   //---send a SMS message---
   SmsManager sms = SmsManager.getDefault();
   sms.sendTextMessage("5556", null, "Greetings", sentPI, deliveredPI);
  }
}

2つのBroadcastReceiverオブジェクトを作った後、
registerReceiver()メソッドを使ってそれらを登録します。
IntentFilterオブジェクトにBroadcastReceiverオブジェクトを
渡すことで登録をし、適合しているアクションを含んでいる
文字コンストラクタをとります。
最後にSmsManagerクラスを使ってSMSメッセージを送信します。
アクティビティがバックグラウンドに回ったときには、
アクティビティのonPause()メソッドにある2つの
BroadcastReceiverを登録しない必要があります。

@Override
public void onPause(){
  super.onPause();
  //---unregister the two BroadcastReceivers---
  unregisterReceiver(smsSentReceiver);
  unregisterReceiver(smsDeliveredReceiver);
}

メッセージの送信と配達が成功したときには、
そのステータスをToastクラスが表示します。


ちょっと注釈

Androidエミュレータ(AVD)を使ってSMSメッセージを送信した時には、
sentPI PendingIntentオブジェクトだけが停止されます。
deliveredPI PendingIntentオブジェクトの方は停止されません。

ホーム
便利堂ロゴ
inserted by FC2 system