liguofeng29’s blog

個人勉強用ブログだっす。

AndroidのContentProvider - SMS発送を監視する

AndroidはContentObserverを提供し、ContentProviderのデータ変更を監視する。

SMS発送を監視するサンプル
(サンプルではActivityですが、Activityを起動しないと監視できないので、現実的ではない。 Serviceで実装すべきである)

<uses-permission android:name="android.permission.READ_SMS"/>
package com.example.liguofeng.smsobserver;

import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // content://smsのデータが変更されているかを監視する
        getContentResolver().registerContentObserver(
                Uri.parse("content://sms"), true,
                new SmsObserver(new Handler()));
    }
    // ContentObserver実装
    private final class SmsObserver extends ContentObserver
    {
        public SmsObserver(Handler handler)
        {
            super(handler);
        }
        public void onChange(boolean selfChange)
        {
            // 送信箱のSMS
            Cursor cursor = getContentResolver().query(
                    Uri.parse("content://sms/outbox")
                    , null, null, null, null);
            // 現在発送中のSMS
            while (cursor.moveToNext())
            {
                StringBuilder sb = new StringBuilder();
                // SMSの送信先
                sb.append("address=").append(cursor
                        .getString(cursor.getColumnIndex("address")));
                // SMSのタイトル
                sb.append(";subject=").append(cursor
                        .getString(cursor.getColumnIndex("subject")));
                // SMSの内容
                sb.append(";body=").append(cursor
                        .getString(cursor.getColumnIndex("body")));
                // SMSの発送時間
                sb.append(";time=").append(cursor
                        .getLong(cursor.getColumnIndex("date")));

                System.out.println("発送SMS:" + sb.toString());
            }
        }
    }
}