標籤:div out 否則 程式 null 等價 query new 欄位
手機通話記錄是儲存在資料庫中的,位置: /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls
這張表中有個type欄位,屬性值為常量值:
- 來電:CallLog.Calls.INCOMING_TYPE (常量值:1)
- 已撥:CallLog.Calls.OUTGOING_TYPE(常量值:2)
- 未接:CallLog.Calls.MISSED_TYPE(常量值:3)
這是最常見的,number欄位表示電話號碼,還有些其他欄位就不一一說明了
添加許可權
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
前兩個許可權是讀/寫連絡人的許可權,最後一個是寫通話記錄的許可權,這個許可權我之前並沒有加上,但是在操作通話記錄時,Android Studio推薦加上這個許可權,否則就會劃紅線,但是並不影響程式運行
編寫代碼
系統通過ContentProvider (內容提供器)向外共用。
Uri
CallLog.Calls.CONTENT_URI 等價於:Uri.parse("content://call_log/calls"); 用哪個都可以
擷取內容解析器
ContentResolver resolver = getContentResolver();
getContentResolver()方法是Content類的方法
操作內容解析器
其實操作和操作Sqlite的方法幾乎一樣,比如說刪除操作:
resolver.delete(CallLog.Calls.CONTENT_URI, "number=?", new String[]{number});
會刪除給定的號碼的所有記錄,還可以增加個條件(如 type=1),刪除給定的號碼的來電記錄
查詢某個連絡人的所有通話記錄可以使用(query方法)
resolver.query(CallLog.Calls.CONTENT_URI, null, "number=?", new String[]{number}, null);
雖然刪除了電話號碼記錄,但是可能會有延遲,所以我們查詢電話號碼錶是否改變了
在MainActivity中增加一個類繼承ContentObserver 用來觀察電話號碼錶是否改變,如果發生變化,則再次刪除該號碼
/** * ContentObserver 上下文觀察者 */ class CallLogObserver extends ContentObserver { private String number; public CallLogObserver(String number, Handler handler) { super(handler); this.number = number; } /** * 如果通話記錄發生改變 * * @param selfChange */ @Override public void onChange(boolean selfChange) { super.onChange(selfChange); deleteCallLog(number); } }
別忘了調用這個類,通過getContentResolver()獲得解析器,再調用registerContentObserver方法,注意最後一個變數給的就是編寫的CallLogObserver類
getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, new CallLogObserver(incomingNumber, new Handler()));
Android筆記——對系統通話記錄的刪除操作