Android中內容觀察者的使用(讀取簡訊內容)
阿新 • • 發佈:2021-02-03
技術標籤:Android Studio開發實戰 從零基礎到APP上線
上次我們說了內容觀察者的使用,細心的朋友會發現,我們需要主動進行查詢才可以知道資料庫是否有了變化。如果我們想在資料庫變化的第一時間就知道怎麼辦?這裡我們以讀取簡訊資料為例,說明內容觀察者的使用方法。
首先我們需要加入一個許可權
<uses-permission android:name="android.permission.READ_SMS"/>
有了這個許可權我們才可以獲取簡訊的內容
接著我們要在需要讀取短息的介面加入觀察的程式碼,示例程式碼如下
public class GcdxnrActivity extends WaterPermissionActivity<GcdxnrModel> implements GcdxnrCallback { private Handler mHandler = new Handler();//宣告一個處理器物件 private SmsGerObserver mObserver;//宣告一個簡訊獲取的觀察器物件 private static Uri mSmsUri;//宣告一個系統簡訊提供器的Uri物件 private static String[] mSmsColumn;//宣告一個簡訊記錄的欄位陣列 private TextView tv_chect_flow; @Override protected GcdxnrModel getModelImp() { return new GcdxnrModel(this,this); } @Override protected int getContentLayoutId() { return R.layout.activity_gcdxnr; } @Override protected void initWidget() { tv_chect_flow = findViewById(R.id.tv_chect_flow); requestPermission(READ_SMS); } @Override protected void doSMS() { initSmsObserver(); } /** * 初始化簡訊觀察器 */ private void initSmsObserver(){ mSmsUri = Uri.parse("content://sms"); mSmsColumn = new String[]{"address","body","date"}; //建立一個簡訊觀察器物件 mObserver = new SmsGerObserver(this,mHandler); //給指定Uri註冊內容觀察器,一旦Uri內部發生資料變化,就出發觀察器的onChange方法 getContentResolver().registerContentObserver(mSmsUri,true,mObserver); } /** * 在頁面銷燬時觸發 */ @Override protected void onDestroy() { //登出內容觀察器 getContentResolver().unregisterContentObserver(mObserver); super.onDestroy(); } /** * 定義一個簡訊獲取的觀察器 */ private static class SmsGerObserver extends ContentObserver { private Activity mActivity;//宣告一個上下文物件 private GcdxnrActivity mainActivity; public SmsGerObserver(Activity activity, Handler handler){ super(handler); mActivity = activity; mainActivity = (GcdxnrActivity) activity; } public void onChange(boolean selfChange){ String sender = ""; String content = ""; //構建一個查詢簡訊的條件語句,這裡使用移動號碼測試,故而查詢10086發來的簡訊 String selection = String.format("address='1008611' and date>%d",System.currentTimeMillis() - 1000*60); //通過內容解析器獲取符合條件的結果集遊標 Cursor cursor = mActivity.getContentResolver().query(mSmsUri,mSmsColumn,selection,null,"date desc"); //迴圈取出遊標所指向的所有簡訊記錄 while (cursor.moveToNext()){ sender = cursor.getString(0); content = cursor.getString(1); break; } cursor.close();//關閉資料庫遊標 mainActivity.setText("傳送者:"+sender+"\n"+"內容:"+content); super.onChange(selfChange); } } public void setText(String text){ if (tv_chect_flow!=null) { tv_chect_flow.setText(text); } } }
首先我們可以看到
requestPermission(READ_SMS);
這裡是請求了一個Manifest.permission.READ_SMS動態許可權,doSMS()是使用者同意權限後執行的方法。我們在這裡執行了initSmsObserver()方法,即初始化觀察器的方法。大家可以使用自己的動態許可權請求的方法。
如果資料庫發生了改變,則會呼叫onChange方法。sender是簡訊傳送者,content是簡訊的內容。
String selection = String.format("address='1008611' and date>%d",System.currentTimeMillis() - 1000*60);
這個程式碼中指定了要查詢的簡訊是哪個號碼傳送的,以及要查詢多久以前的簡訊。
大家有什麼疑問都可以在評論區給我留言。