1. 程式人生 > 其它 >Android中內容觀察者的使用(讀取簡訊內容)

Android中內容觀察者的使用(讀取簡訊內容)

技術標籤: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);

這個程式碼中指定了要查詢的簡訊是哪個號碼傳送的,以及要查詢多久以前的簡訊。

大家有什麼疑問都可以在評論區給我留言。