1. 程式人生 > >Android 簡訊傳送監控

Android 簡訊傳送監控

最近研究了一下如何對Android傳送簡訊進行監控,首先考慮到是否會有廣播機制,查了一下api文件發現沒有,到了網上查了半天也沒用解決辦法,主要問題還是Android沒有提供這中監聽機制,怎麼辦呢,誒,苦想了幾天,想到了一個還算可行的方法,但是隻能對系統簡訊進行監控,還是不能對第三方進行監控,沒辦法,好了下面介紹一下我的實現方法。主要是利用Android對contentProvider內容變化監聽方法實現ContentObserver類,

具體如下;

package com.listener.app;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class SmsStatus extends Service{
	
	
	@Override
	public void onCreate() {
		//為content://sms的資料改變註冊監聽器
		getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, new SmsObserver(new Handler()));
		
		super.onCreate();
	}
	// ContentObserver監聽器類
	private final class SmsObserver extends ContentObserver{
		
		public SmsObserver(Handler handler){
			super(handler);
		}
		public void onChange(boolean selfChange){
			
			sendMsg();
		   
		}
		
		private	void sendMsg(){
			Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null);
			if (cursor.moveToFirst()){
				StringBuilder sb = new StringBuilder();
				// 獲取簡訊的傳送地址
				sb.append("address=").append(
					cursor.getString(cursor.getColumnIndex("address")));					
				// 獲取簡訊的標題
				sb.append('\n'+"subject=").append(
					cursor.getString(cursor.getColumnIndex("subject")));
				// 獲取簡訊的內容
				sb.append('\n'+"body=").append(
					cursor.getString(cursor.getColumnIndex("body")));
				// 獲取簡訊的傳送時間
				 SimpleDateFormat dateFormat = new SimpleDateFormat(   
	                        "yyyy-MM-dd hh:mm:ss");   
	                Date d = new Date(Long.parseLong(cursor.getString(cursor.getColumnIndex("date"))));   
	               String date = dateFormat.format(d); 
				sb.append('\n'+"time=").append(date);
				Log.e("msg", "Sent SMS:" + sb.toString());
			}
			if(cursor!=null){
				cursor.close();
				cursor=null;
			}
		}
	
	
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}	
	
}

以上有幾點需要注意;

1,content必須為content://sms/不能改為content://sms/outbox,即系統只能對整個簡訊的content進行監控而不能對content中item進行監控

2,ContentObserver監聽時最好放置在service類中,以確保內容為時時監聽。