天天看點

2-AIV--使用ContentProvider查詢聯系人

零、前言

[1].顧名思義,内容提供者,目的:實作跨程序間資料共享

[2].基于資料庫提供資料

[3].如電話簿,短信,歌曲資訊都是以資料庫存儲存儲,都可以通過ContentProvider擷取

[4].不太熟悉安卓運作時權限的童鞋可以看一下我封裝的權限申請類:

TI--安卓運作時權限完美封裝

[5].如果隻是想使用的人,直接把靜态方法拷貝即可,想知道原理的,圖檔和注釋認真看一下,也可以自己分析一下聯系人的表。

[6].本文隻列印一下查詢結果:ListView篇将會界面展示資料,Xml篇将會介紹備份到本地

一、代碼實作

1.實作分析:

raw_contacts表中查到contact_id,

每個contact_id下,根據contact_id查詢data表字段,

然後判斷mimetype的值,建立實體類,将資料設定到實體中,

将實體放入實體集合,查完傳回集合。

聯系人資料庫

聯系人.png

我們關注的時三張表:

1.raw_contacts 關注一個字段contact_id

raw_contacts.png

2.data表和mimetype表:關注字段:mimetype_id 、raw_contact_id 、data1

data.png

2.實體類
/**
 * 作者:張風捷特烈
 * 時間:2018/4/14:9:23
 * 郵箱:[email protected]
 * 說明:聯系人實體類
 */
public class ContactBean {
    /**
     * 聯系人姓名
     */
    public String name;
    /**
     * 聯系人位址
     */
    public String address;
    /**
     * 聯系人郵箱
     */
    public String email;
    /**
     * 聯系人電話
     */
    public String phone;
    /**
     * 聯系人頭像
     */
    public Bitmap photo;

    @Override
    public String toString() {
        return "ContactBean{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", email='" + email + '\'' +
                ", phone='" + phone + '\'' +
                ", photo=" + photo +
                '}';
    }
}
           
1.查詢聯系人的封裝方法
/**
     * 擷取聯系人:ContactBean字段:name姓名  address位址  email郵箱 phone手機号
     *
     * @param ctx 上下文
     * @return ContactBean集合
     */
    public static List<ContactBean> getContact(Context ctx) {
        //建立一個容器放結果
        List<ContactBean> contactBeans = new ArrayList<>();
        //[1.]獲得ContentResolver對象
        ContentResolver resolver = ctx.getContentResolver();
        //[2.1]得到Uri :通路raw_contacts的url
        Uri raw_contactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
        //[2.2]得到Uri ://通路data的url
        Uri dataUri = Uri.parse("content://com.android.contacts/data");
        //[3]查詢表,獲得raw_contact表遊标結果集
        Cursor raw_contactsCursor = resolver.query(
                raw_contactsUri, new String[]{"contact_id"}, null, null, null);
        //[4]周遊遊标,擷取資料,儲存在bean中
        while (raw_contactsCursor.moveToNext()) {
            //[4.1]查詢到contact_id
            String contact_id = raw_contactsCursor.getString(0);
            if (contact_id != null) {
                //[4.2]查詢表,獲得data表遊标結果集
                Cursor dataCursor = resolver.query(dataUri,
                        new String[]{"data1", "mimetype"},//注意不是mimetype_id
                        "raw_contact_id=?",
                        new String[]{contact_id}, null);
                //[4.3]建立實體類
                ContactBean contactBean = new ContactBean();
                while (dataCursor.moveToNext()) {
                    String result = dataCursor.getString(0);
                    //[4.4]根據實體類判斷資料,放入實體類中
                    String mimetype = dataCursor.getString(1);
                    if (mimetype != null) {
                        switch (mimetype) {
                            case "vnd.android.cursor.item/phone_v2":
                                contactBean.phone = result;
                                break;
                            case "vnd.android.cursor.item/email_v2":
                                contactBean.email = result;
                                break;
                            case "vnd.android.cursor.item/name":
                                contactBean.name = result;
                                break;
                            case "vnd.android.cursor.item/postal-address_v2":
                                contactBean.address = result;
                                break;
                        }
                    }
                }
                //[5.1]關閉data表Cursor
                dataCursor.close();
                contactBeans.add(contactBean);//加入集合
            }
        }
        //[5.2]關閉raw_contacts表Cursor
        raw_contactsCursor.close();
        return contactBeans;
    }
           
2.查詢聯系人頭像:這個比較耗時,要不要酌情處理,是以封裝個方法,沒有直接寫在上面的方法中
/**
     * 根據号碼獲得聯系人頭像
     *
     * @param ctx    上下文
     * @param number 号碼
     * @return 圖檔
     */
    public static Bitmap getContactPhoto(Context ctx, String number) {
        Bitmap bmpHead = null;
        ContentResolver resolver = ctx.getContentResolver();//獲得ContentResolver對象
        // 獲得Uri
        Uri uriNumber2Contacts = Uri.parse("content://com.android.contacts/"
                + "data/phones/filter/" + number);
        // 查詢Uri,傳回資料集
        Cursor cursorCantacts = resolver.query(uriNumber2Contacts, null, null, null, null);
        // 如果該聯系人存在
        if (cursorCantacts.getCount() > 0) {
            // 移動到第一條資料
            cursorCantacts.moveToFirst();
            // 獲得該聯系人的contact_id
            Long contactID = cursorCantacts.getLong(cursorCantacts.getColumnIndex("contact_id"));
            // 獲得contact_id的Uri
            Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactID);
            // 打開頭像圖檔的InputStream
            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);
            // 從InputStream獲得bitmap
            bmpHead = BitmapFactory.decodeStream(input);
        }
        return bmpHead;
    }
           
3.使用:權限:

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

注意:查詢資料庫是耗時操作,為了不阻塞主線程,最好建立個線程操作
new Thread(new Runnable() {
    @Override
    public void run() {
        List<ContactBean> contact = PhoneUtils_Contact.getContact(MainActivity.this);
        System.out.println(contact.get(0));
    }
}).start();
           

後記、

1.聲明:

[1]本文由張風捷特烈原創,轉載請注明

[2]歡迎廣大程式設計愛好者共同交流

[3]個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正

[4]你的喜歡與支援将是我最大的動力

2.連接配接傳送門:
更多安卓技術歡迎通路:安卓技術棧 我的github位址:歡迎star 簡書首發,騰訊雲+社群同步更新 張風捷特烈個人網站,程式設計筆記請通路: http://www.toly1994.com
3.聯系我

QQ:1981462002

郵箱:

[email protected] 微信:zdl1994328
4.歡迎關注我的微信公衆号,最新精彩文章,及時送達:

公衆号.jpg