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

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

送られてくるSMSメッセージをインターセプトします

Intercepting Incoming SMS Messages

すべての受信SMSメッセージを止めたいとして、結果、
開発するアプリケーションだけが受信できるようにします。
Androidアプリケーションの内部からSMSメッセージを受信するためには、
パッケージに新しいJavaクラスを加える必要があります。
このクラスは以下のようにBroadcastReceiver基底クラスの
拡張が必要になります。

package net.learn2develop.interceptsmsmessages;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context cotext, Intent intent){
   //---get the SMS message passed in---
   Bundle bundle = intent.getExtras();
   SmsMessage[] msgs = null;
   String str = "SMS from ";
   if(bundle != null){
    //---retrive the SMS message received---
    Object[] pdus = (object[]) bundle.get("pdus");
    msgs = new SmsMessage[pdus.length];
    for (int i=0; i      msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
     if(i==0){
     //---get the sender address/phone number---
     str += msgs[i].getOriginatingAddress();
     str += ": ";
     }
     //---get the message body---
     str += msgs[i].getMessageBody().toString();
    }
    //display the new SMS message---
    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();

    //prevent this SMS message from being broadcasted---
    abortBroadcast();
    Log.d("SMSReceiver", str);
   }
  }
}

このBroadcastクラスは、sendBroadcast()メソッドを使っている
他のアプリケーションで送信したIntentを開発するアプリケーションに
受信できるようにしてくれます。
(この場合のAndroid OSは送られてくるSMSメッセージを受信する時に
動作します。)
Intentが受信された時に、onReceive()メソッドが呼び出されますので、
このメソッドを再定義する必要があります。
送られてきたSMSメッセージを受信したときに、
onReceive()メソッドは停止します。
SMSメッセージはBundleオブジェクトを経由して、
Intentオブジェクトの中に含まれています。
(Intentは、onReceive()メソッドの2番目のパラメタです。)
それぞれのSMSメッセージが受信された時にonReceive()メソッドが
実行されることに注目します。
もし、デバイスが5つのSMSメッセージを受信したら、
その時には、onReceive()メソッドは5回呼び出されます。
それぞれのSMSメッセージはPDUフォーマットにあるObject配列に
保存されています。
もし、SMSメッセージが160文字以下のものであれば、
その時は、そのメッセージは複数のちいさなメッセージに分けられ、
配列の中の複数の要素として保存されます。
それぞれのメッセージの内容を引き出すには、
SmsMessageクラスから静的なcreateFromPdu()メソッドを使います。
送信者の電話番号はgetOriginatingAddress()メソッドを経由して
取得されます。そのため、
もし、送信者に自動返信を送る必要があったら、
getOriginatingAddress()送信者の電話番号を取得するための
メソッドとなります。
メッセージの本体を引き出すためには、
getMessageBody()メソッドを使います。
abortBroadcast()メソッドはさらにbroadcastされているものから、
現在のIntentオブジェクトを防ぎます。
本質的には、このSMSメッセージを受信することから、
他のアプリケーションを防ぐべきです。
開発するアプリケーションが送られてきたSMSメッセージが
受信されたときにBroadcastReceiverクラスを停止させるためには、
AndroidManifest.xmlファイルにBroadcastReceiverクラスを登録し、
パーミッションを加える必要があります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="net.learn2develop.interceptsmsmessages"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
   android:minSdkVersion="8"
   android:targetSdkVersion="15" />

  <uses-permission android:name="android.permission.RECEIVE_SMS" />

  <application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <activity
    android:name=".MainActivity"
    android:label="@string/title_activity_main" >
    <intent-filter
     <action android:name="android.intent.action.MAIN" />

     <category android="name="android.intent.category.LAUNCHER" />
    </intent-filter>
   </activity>

   <receiver android:name=".SMSReceiver" >
    <intent-filter android:priority="100" >
     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
   </receiver>
  </application>
</manifest>

android.priority属性に高い値をセットすることは、
メッセージを受信するために開発するアプリケーションにより高い
優先権を与えます。
本来、デバイスに組み込まれたメッセージアプリケーションがする前に、
開発するアプリケーションにSMSを受信させるためのもので、
結果、ユーザが気づかない内にメッセージを横取りできます。


ちょっと注釈

一度、AndroidManifest.xmlファイルにあるBroadcastReceiverクラスを
登録したら、アプリケーションはたとえ実行されていなくても
送られてくるSMSメッセージを見張り続けます。
そのアプリケーションがデバイスにインストールされている間ずっと。
すべてのSMSメッセージがアプリケーションによって
受信されることになります。


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