アプリでSMSを受信したい

携帯へ何かを通知したい場合、日本のようにi-modeメールでプッシュ配信できない海外では、SMSを使うのが主流。サーバーからアプリに何かの情報を配信する場合も、この仕組みをつかうのが一番簡単だと思う。

★AndroidのSMSに関する資料

上に紹介したAPI Demoをビルドして検証しようとしたところ、なぜかSMSのデモがメニューからなくなっていた。調べてみると、自分のAndroid(Experia X10 mini: Android version 2.1 update)にあわせて設定したビルドターゲット、つまりAPI Level 7(=Version2.1 update)のAPI DemoにはSMS関連のソースが無かった(Level8と9にはある)。ビルドターゲットをAPI Level8 でAPI Demoのプロジェクトを作り直しすと、SMS関連のデモも動いた。

エミュレータにSMSを送るには、Eclipseで[Window]-[Open Perspective]-[DDMS]を開き、Emulator Controlから送信。

SMSを受信すると、メッセージを表示するウィンドウが現れ、さらにメッセージを読み上げる。SMSを受信する設定になっている間は、API Demo の画面を閉じても、SMSを受信するとメッセージを表示するウィンドウは現れる。

しかしSDKのリファレンスによると、SMS関連のクラスはAPI Level7でも使えるはずだ。API Level 8のAPI DemoのソースからSMS関連のソースをコピーしてビルドターゲットをAPI Level 7にしてビルドしてみた。

新規プロジェクトを作成し、SmsMessageReceiver.java と SmsReceivedDialog.java はそのままコピーしてPackage名だけを変更。プロジェクトのActivityクラスには、SmsMessageDemo.java の中身をそっくりコピー。res/values/strings.xml には、関連する文字列をコピー。res/layout/sms_demo.xml はそのままコピーしただけではビルドできなかったが、プロパティ layout_widthとlayout_heightの値 “match_parent” を “fill_parent” に置き換えてビルドできた。

・・・で、動かしてみるが、SMSを送っても反応しない。SmsMessageReceiver にブレークポイントを張って動かしてみたが、最初から最後まで止まらない。よくソースを見返してみると、SmsMessageReceiver を BroadcastReceiverとして追加するコードがない・・・。API Demo の元のソースをみてもない。しかし、上で紹介した http://www.androidcompetencycenter.com の記事を見て、Manufest.xmlで Receiver として設定する必要があることがわかった。API Demo の元のソースにもあったので、そこからコピー。さらに、元の Manufest.xml には SMSの機能に関する uses-permission も設定されていたので、それもコピー。これで SMS に反応するようになった。

しかし、SMS を受信してすぐに落ちてしまう・・・。ログを見ると、権限が足りなくてExceptionが発生している。SMS 関連の uses-permission は全てつけたはずだが・・・?デバッガで見てみると、SMS を受信した後で、電話帳から発信元番号の主を検索する処理が入っていて、ここで落ちていた。なるほど!電話帳のアクセス件が必要だったわけだ。確かに元の Manufest.xml にはあったので、それをコピーして追加。これで正常に動くようになった。SMS の受信だけでなく、電話帳の検索方法まで紹介してくれていた。なんて親切なサンプルコードなんだ!(>_<)

ちなみにiPhoneでは、SMSの送信はできるが受信はできないらしい。アプリにプッシュ式で通知する仕組みとしては、Local and Push Notification というのがあるようだが、ハードルが高そうなので、今は止めておく。

★iPhoneのSMSとLocal and Push Notification に関する資料

1件のフィードバック to “アプリでSMSを受信したい”

  1. 起きろ!…起きろってば!(深い眠りに入ったアプリを叩き起こす) « スマホアプリの自習帳 Says:

    […] これで、タイマーまたはSMSを受信したタイミングで、カメラで画像を撮影し、Picasa へのアップロードを行うアプリができた。(→ダウンロード) 共有:共有メールFacebookTwitterLike this:Like一番乗りで「Like」しませんか。 […]

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください