關於android 聯絡人,簡訊,電話記錄,需要的uri,資料庫中獲取的小結,請看註釋
關於android 聯絡人,簡訊,電話記錄,需要的uri,資料庫中獲取的小結
// 簡訊會話Uri
public static final Uri CONVERSATION_URI = Uri.parse(“content://mms-sms/conversations”);
// 簡訊Uri 對應的ContentProvider會協調處理簡訊的收件箱和發件箱
public static final Uri SMS_URI = Uri.parse(“content://sms”);
// 簡訊發件箱:
public static final Uri SMS_SEND_URI = Uri.parse(“content://sms/sent”);
// 簡訊收件箱:
public static final Uri SMS_INBOX_URI = Uri.parse(“content://sms/inbox”);
截獲簡訊的步驟
1.新增receive sms的許可權
2.當有簡訊發來時候,系統會發出一個廣播有序廣播,所以要訂閱這個系統廣播
android.provider.Telephony.SMS_RECEIVED
把廣播接收器的許可權設定為1000
3.定義廣播接收器重寫onReceive()方法,從intent中獲得並解析簡訊的內容,把簡訊的內容存入收件箱。
4. Android裝置接收到的SMS是以pdu形式的(protocol description unit)。所以從intent提取資料時就會遇到pdus。
讀取聯絡人的URI:
/**
* 所有聯絡人的查詢語句
* cotacts2聯絡人資料庫中
* 與聯絡人相關的幾張資料表
* contacts
* data
* mimetypes
*/
Cursor contactsCusor = context.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
new String[] { Contacts._ID, Contacts.PHOTO_ID,
Contacts.LOOKUP_KEY }, null, null, null);
Cursor cursor = context.getContentResolver().query( ContactsContract.Data.CONTENT_URI, new String[] { Data.MIMETYPE, Data.DATA1, Data.DATA15 }, Data.RAW_CONTACT_ID + "=" + contacts_id, null, null); Data.DATA1:這個欄位就是所有聯絡人的資訊; Data.MIMETYPE:這個欄位就是根據mimetypes這個表中的ID是對應的; 返回的是一個String型別的資料是,可以跟下面的資料進行匹配。 確定(Data.DATA1)返回的具體是什麼: 1)"vnd.android.cursor.item/phone_v2":手機號 2)"vnd.android.cursor.item/email_v2":Email 3)"vnd.android.cursor.item/name":名字 4)"vnd.android.cursor.item/postal-address_v2":地址 5)"vnd.android.cursor.item/organization":公司 Data.DATA15:這個欄位就是查詢出來的頭像; 實現思路:根據上一個表中查出的Contacts._ID去Data表中查詢,返回的Data.DATA1就是所有的聯絡人資訊, 根據Data.MIMETYPE的資料去跟mimetypes這張表去進行匹配,來確定具體返回的資訊是(名字,電話....)
記住讀取通話記錄需要配置許可權:
讀取通話記錄的URI:
/**
* 所有通話記錄的查詢語句
*/
String [] projection = new String[]{CallLog.Calls._ID, //通話記錄的_id
CallLog.Calls.CACHED_NAME, //通話記錄的名字;
CallLog.Calls.NUMBER, //電話號碼
CallLog.Calls.DATE, //通話的時間
CallLog.Calls.TYPE}; //通話的型別 1 呼入電話 2撥出電話 3未接電話
Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI,
projection,
null, null, CallLog.Calls.DATE+" desc");
記住讀取簡訊需要配置許可權:
讀取簡訊的URI:
/**
* 所有的簡訊
*/
public static final String SMS_URI_ALL = "content://sms/";
/**
* 收件箱簡訊
*/
public static final String SMS_URI_INBOX = "content://sms/inbox";
/**
* 發件箱簡訊
*/
public static final String SMS_URI_SEND = "content://sms/sent";
/**
* 草稿箱簡訊
*/
public static final String SMS_URI_DRAFT = "content://sms/draft";
/**
*會話的URI
*/
public static final String THREAD_URI = "content://mms-sms/conversations"
/**
*所有簡訊的URI
*/
public static final String SMS_URI = "content://sms"
讀取會話列表獲取最後一條簡訊息有(根據自己需求):
欄位名稱:body,該欄位是簡訊內容
欄位名稱:person,該欄位的值是:null(代表會話中最後一條簡訊的發信人 是我或者陌生人取值null,如果是通訊錄中有的人,值就是contacts表中該聯絡人的id)
欄位名稱:type,該欄位的值是:2 (type 1 收簡訊 2發出簡訊)
欄位名稱:date,該欄位的值是:1462352825441
欄位名稱:_id,該欄位的值是:5 (該會話中最後一條簡訊在sms資料表中的id)
欄位名稱:read,該欄位的值是:1 (1 已讀 0 未讀)
欄位名稱:thread_id,該欄位的值是:1
欄位名稱:address,該欄位的值是:1 366-136-1366(無論最後一條簡訊是誰傳送的,該欄位儲存的電話就是該會話中對方的電話)
姓名和頭像ID在threads表的contentProvider依然不能提供,需要利用電話號碼去phone_lookup表中反向查詢。
uri:PhoneLookup.CONTENT_FILTER_URI
頭像id:PhoneLookup.PHOTO_ID
姓名:PhoneLookup.DISPLAY_NAME
讀取一條會話的所有簡訊息:
String [] projection = new String[] { "_id",
"body", "date", "type" };
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, projection, "thread_id = "+thread_id, null, "date asc");
欄位名稱:body,:該欄位是簡訊內容
欄位名稱:type, 該欄位是簡訊型別(type 1 收簡訊 2發出簡訊)
欄位名稱:date,:該欄位是簡訊時間戳
欄位名稱:_id,:該欄位是簡訊表中的ID
欄位名稱:thread_id,:該欄位是會話的ID
====================================================================================================================================
利用電話號碼反查頭像ID:
calls表中的photo_id列資料存在一個小問題,當對方撥打電話進來時,如果沒有接聽,則對方的頭像ID值是
不會記錄在calls表中的。此時CalllogFragment中顯示該條通話記錄的時候就不會有頭像出現。所以,需要利用
電話號碼去其它表中查詢該使用者的頭像ID。
利用電話號碼查詢頭像ID最簡單的方式就是利用phone_lookup表的
ContentProvider來進行查詢。查詢時需要注意的是,
該ContentProvider支援的Uri格式為:
Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 電話號碼);
完整的利用電話號碼查詢頭像id的程式碼例項為:
protected static int getPhotoIdByNumber(Context context,String number) {
int photoId = 0;
//利用phone_lookup資料表所對應的ContentProvider進行查詢
ContentResolver cr = context.getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number);
Cursor c = cr.query(uri , new String[]{PhoneLookup.PHOTO_ID}, null, null, null);
//如果提供的電話號碼確實是有頭像的
if(c.moveToNext()){
photoId = c.getInt(0);
}
c.close();
return photoId;
}