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

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

発信した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
パーミッションを加えることをお忘れなく。

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