Android-使用ContentObserver監聽ContentProvider中數據的變化(短信竊聽)


 Android-監聽ContentProvider中數據的變化

 

 

如果ContentProvider的訪問者需要知道ContentProvider中的數據發生了變化,可以在ContentProvider 發生數據變化時調用getContentResolver().notifyChange(uri, null)來通知注冊在此URI上的訪問者,例子如下:

public class PersonContentProvider extends ContentProvider {

public Uri insert(Uri uri, ContentValues values) {

       db.insert("person", "personid", values);

       getContext().getContentResolver().notifyChange(uri, null);

}

}

 

如果ContentProvider的訪問者需要得到數據變化通知,必須使用ContentObserver對數據(數據采用uri描述)進行監聽,當監聽到數據變化通知時,系統就會調用ContentObserver的onChange()方法:

 

getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"),

 

                      true, new PersonObserver(new Handler()));

 

public class PersonObserver extends ContentObserver{

 

       public PersonObserver(Handler handler) {

 

              super(handler);

 

      }

 

       public void onChange(boolean selfChange) {

 

           //此處可以進行相應的業務處理

 

       }

 

}

 

l       竊聽用戶發出的短信

 

用戶使用系統自帶的短信程序發送短信,程序會通過ContentProvider把短信保存進數據庫,並且發出一個數據變化通知,使用ContentObserver對數據變化進行監聽,在用戶發送短信時,就會被ContentObserver竊聽到短信:

 

注冊監聽:

 

getContentResolver().registerContentObserver(Uri.parse("content://sms"),  true, new SmsObserver(new Handler()));

 

監聽類:

 

private final class SmsObserver extends ContentObserver{

 

       public SmsObserver(Handler handler) {

 

              super(handler);

 

       }

 

       public void onChange(boolean selfChange) {//查詢發送箱中的短信(處於正在發送狀態的短信放在發送箱)

 

              Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"),null, null, null, null);

 

              while(cursor.moveToNext()){

 

                     StringBuilder sb = new StringBuilder();

 

                     sb.append("_id=").append(cursor.getInt(cursor.getColumnIndex("_id")));

 

                     sb.append(",address=").append(cursor.getString(cursor.getColumnIndex("address")));

 

                     sb.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));

 

                     sb.append(";time=").append(cursor.getLong(cursor.getColumnIndex("date")));

 

                     Log.i("ReceiveSendSMS", sb.toString());

                    } }   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM