送信した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オブジェクトの方は停止されません。
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
view
Androidのアプリを開発する
上で使う部品のことで、
トリガボタン・イメージボタン
チェックボックスなどのこと。
UI
ユーザインターフェースのこと。
Bind(バインド)
シンボルとデータを
関連させるため
または、データの一片と
他のものを関連させること。
以下は例。
・変数に値を入れる。
(変数の初期化)
・特定のEthernetポートと
ネットワークプロトコルを
関連付けする。
・Javaの変数のセット上に
XML文書を配置すること。
または、ほかの
プログラミング言語でも。
|