操作Android中連絡人,通話記錄,短息,的URI,和具體的查詢語句,欄位註解。(根據自己需求)

來源:互聯網
上載者:User

標籤:

      記住讀取連絡人需要配置許可權:<uses-permission android:name="android.permission.READ_CONTACTS" />
                                                             <uses-permission android:name="android.permission.WRITE_CONTACTS" />

讀取連絡人的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這張表去進行匹配,來確定具體返回的資訊是(名字,電話....)

記住讀取通話記錄需要配置許可權:

                <uses-permission android:name="android.permission.READ_CALL_LOG" />

                <uses-permission android:name="android.permission.WRITE_CALL_LOG" />


讀取通話記錄的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");


記住讀取簡訊需要配置許可權:

                 <uses-permission android:name="android.permission.READ_SMS" />
                 <uses-permission android:name="android.permission.WRITE_SMS" />

讀取簡訊的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;
    }

====================================================================================================================================

操作Android中連絡人,通話記錄,短息,的URI,和具體的查詢語句,欄位註解。(根據自己需求)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.