発信したSMSメッセージをモニタする
Monitoring Outgoing SMS Messages
ユーザがデバイスに組み込まれたメッセージアプリケションを使って、
送るすべての送信SMSメッセージをモニタしたいとします。
この場合、メッセージアプリケーションを使うことで、
SMSコンテンツプロバイダの変化を見張る必要があります。
すべてのメッセージをメッセージアプリケーションで送受信は、
content://smsに配置されているコンテンツプロバイダに
保存されています。
そのため、もしユーザがメッセージを送信したら、
そのメッセージはこのコンテンツプロバイダに保存されます。
このコンテンツプロバイダの変化をモニタするには、
ContentResolverとContentObserverの2つのクラスを
使う必要があります。
package net.learn2develop.detectoutgoingsms;
import android.app.Activity;
import android.content.ContentReceiver;
import android.database.ContentObserver;
import android.os.Bundle;
public class MainActivity extends Activity{
ContentResolver contentResolver;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layour.activity_main);
}
}
ContentResolverオブジェクトは開発者にコンテンツプロバイダに
アクセスできるようにしてくれて、
一方ContentObserverオブジェクトはコンテンツプロバイダの内容に
変化があった時にコールバックを登録できるようにしてくれます。
ContentResolverオブジェクトのインスタンスを作るためには、
getContentResolver()メソッドをつかいます。
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layour.activity_main);
contentResolver = getContentResolver();
}
ContentObserverオブジェクトのインスタンスを作るためには、
ContentObserverの新しいインスタンスを作り、
onChange()とdeliverSelfNotifications()、この2つのメソッドを
再定義します。
package ner.learn2develop.detectoutgoingsms;
import android.app.activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
public class MainActivity extends Activity{
ContentResolver contentResolver;
ContentObserver smsContentObserver;
@Override
public void onCreate(Vundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
}
@Override
public void onResume(){
super.onResume();
smsContentObserver = new ContentObserver(new Handler()){
@Override
public void onChange(boolean selfChange){
Uri smsURI ~ Uri.parse(#content://sms/sent");
Cursor c = getContentResolver().query(smsURI,
new String[] {"address", "date", "body", "type" },
null, null, null);
String[] columns = new String[]{
"address", "date", "body", "type" };
//---go to the first row; which is the most recently
//sent massage---
c.moveToNext();
//---get the various properties of the SMS message---
String recipient = c.getString(c.getColumnIndex(columns[0]));
String date = c.getString(c.getColumnIndex(columns[1]));
String message = c.getString(c.getClumnIndex(columns[2]));
String type = c.getString(c.getColumnIndex(columns[3]));,br />
//---print out the details of the massage---
Log.d("DetectOutgoingSMS", recipient + ", " + date + ", " +
message + ", " + type);
}
@Override
public boolean deliverSelfNotifications(){
return true;
}
};
contentResolver.registerContentObserver(
Uri.parse("content://sms"), true, smsContentObserver);
}
}
上のコード部では、registerContentObserve()メソッドを使って、
ContentResolverオブジェクトと共にConntentObserverオブジェクトを
登録します。
content://smsコンテンツプロバイダを作った変更をモニタします。
それらが起こったときにonChange()メソッドは停止します。
そこでメッセージアプリケーションを使って送った
すべてのメッセージを検索するためにCursorオブジェクトを使います。
最新のメッセージを検索するためには、
単純に次のレコードにcursorを移動し、詳細を印刷します。
メッセージを送ったときにメッセージアプリケーションが
使われていることに注目します。
最初の2回、onChange()メソッドが停止したのは、
以前のメッセージが送られたためで、
3回目は、ユーザが送信したメッセージを正確に表示するでしょう。
SMSの詳細は受信者の電話番号、送信時間、メッセージ内容と
メッセージの型を含んでいます。
ちょっと注釈
不思議に思うかもしれませんが、content://smsの変化を
見ていく代わりに、
content://sms/sentの変化をただモニタするのはできません。
次のようになります。
contentResolvr.registerContentObserver(
Uri.parse("content://sms/sent"), true,
smsContentObserver);
しかし、ContentObserverオブジェクトがトリガになりません。
変化のモニタができたときに、
大事なのはContentObserverオブジェクトを登録しないことです。
unregisterContentObserver()メソッドを使ってこれを行います。
@Override
public void onDestroy(){
super.onDestroy();
contentResolver.unregisterContentObserver(
smsContentObserver);
}
SMSコンテンツプロバイダの内容をプログラム的に読むために
AndroidManifest.xmlファイルにandroid.permission.READ_SMS
パーミッションを加えることをお忘れなく。
|
【用語解説】
XML
HTMLと同じような言語ですが、
すべての型の複雑なデータ構造を
送信するための設計ができる
ファイル型式。
オブジェクト
ある手続きを持った
データアイテムで、
他の手続きと関連づけされるもの
metaタグ
ウェブページに与える
情報の宣言につかわれ
検索エンジン・ウェブアプリ
などにウェブページの内容を
伝える役目をする。
metaタグの内容は
ページ内に表示されない。
コンストラクタ
オブジェクト指向
プログラミングで使われ
新しいオブジェクトが
作られ時に呼び出される
メソッドのこと。
クラス
オブジェクト指向
プログラミングでの
オブジェクトの型
オブジェクト指向プログラミング
プログラミングの
方式のことで、
プログラマはデータ型を
定義できるだけでなく
自動的にデータ型と
メソッドを関連付け
できる
アクティビティ
Androidにおける
アクティビティは
Androidアプリの画面に
相当するもの
ボタンやウェブページ
など表示されている
すべてのもののこと。
view
Androidのアプリを開発する
上で使う部品のことで、
トリガボタン・イメージボタン
チェックボックスなどのこと。
UI
ユーザインターフェースのこと。
Bind(バインド)
シンボルとデータを
関連させるため
または、データの一片と
他のものを関連させること。
以下は例。
・変数に値を入れる。
(変数の初期化)
・特定のEthernetポートと
ネットワークプロトコルを
関連付けする。
・Javaの変数のセット上に
XML文書を配置すること。
または、ほかの
プログラミング言語でも。
|