package org.anymobile.demo.sms;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class SMSObserver extends ContentObserver
{
public static final String TAG = "SMSObserver";
private static final String[] PROJECTION = new String[]
{
SMS._ID,//0
SMS.TYPE,//1
SMS.ADDRESS,//2
SMS.BODY,//3
SMS.DATE,//4
SMS.THREAD_ID,//5
SMS.READ,//6
SMS.PROTOCOL//7
};
private static final String SELECTION =
SMS._ID + "
> %s" +
// "
and " + SMS.PROTOCOL + " = null" +
// "
or " + SMS.PROTOCOL + " = " + SMS.PROTOCOL_SMS + ")"
+
" and (" + SMS.TYPE + " = " + SMS.MESSAGE_TYPE_INBOX +
" or " + SMS.TYPE + " = " + SMS.MESSAGE_TYPE_SENT + ")";
private static final int COLUMN_INDEX_ID = 0;
private static final int COLUMN_INDEX_TYPE = 1;
private static final int COLUMN_INDEX_PHONE = 2;
private static final int COLUMN_INDEX_BODY = 3;
private static final int COLUMN_INDEX_PROTOCOL = 7;
private static final int MAX_NUMS = 10;
private static int MAX_ID = 0;
private ContentResolver mResolver;
private Handler mHandler;
public SMSObserver(ContentResolver
contentResolver, Handler handler)
{
super(handler);
this.mResolver = contentResolver;
this.mHandler = handler;
}
@Override
public void onChange(boolean
selfChange)
{
Log.i(TAG, "onChange : " + selfChange + "; " + MAX_ID + "; " + SELECTION);
super.onChange(selfChange);
Cursor cursor = mResolver.query(SMS.CONTENT_URI, PROJECTION,
String.format(SELECTION, MAX_ID), null, null);
int id, type, protocol;
String phone, body;
Message message;
MessageItem item;
int iter = 0;
boolean hasDone = false;
while (cursor.moveToNext())
{
id
= cursor.getInt(COLUMN_INDEX_ID);
type
= cursor.getInt(COLUMN_INDEX_TYPE);
phone
= cursor.getString(COLUMN_INDEX_PHONE);
body
= cursor.getString(COLUMN_INDEX_BODY);
protocol
= cursor.getInt(COLUMN_INDEX_PROTOCOL);
if (hasDone)
{
MAX_ID = id;
break;
}
if (protocol ==
SMS.PROTOCOL_SMS && body != null && body.startsWith(SMS.FILTER))
{
hasDone
= true;
item = new MessageItem();
item.setId(id);
item.setType(type);
item.setPhone(phone);
item.setBody(body);
item.setProtocol(protocol);
message = new Message();
message.obj = item;
mHandler.sendMessage(message);
}
else
{
if (id > MAX_ID) MAX_ID = id;
}
if (iter > MAX_NUMS) break;
iter
++;
}
}
}
|