溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android聯(lián)系人的一些讀取操作

發(fā)布時間:2020-07-24 16:09:54 來源:網(wǎng)絡(luò) 閱讀:2648 作者:NashLegend 欄目:移動開發(fā)

源碼來自我的一個撥號應(yīng)用:https://github.com/NashLegend/QuicKid


1.讀取帶電話號碼的所有聯(lián)系人。

    Android系統(tǒng)貌似沒有直接取得帶電話號碼的聯(lián)系人列表的功能。直接讀取Contacts.CONTENT_URI只能讀取聯(lián)系人信息卻得不到電話號碼。如果先讀取聯(lián)系人列表,再通過聯(lián)系人列表一個一個讀取電話號碼又非常慢,所以可以這樣讀:先從Phone.CONTENT_URI讀取出電話列表,但是有可能一個人對應(yīng)多個號碼,這時只要合并一下就可以了,根據(jù)Contacts.SORT_KEY_PRIMARY排序,同一個人的不同號碼是靠在一起的,這樣合并就變得非常容易,壞處是對于沒有電話號碼的聯(lián)系人這里是取不到的。(Contact是一個自定義類,這里沒有寫出來,這不是重點……)

    public static void loadContacts(Context context) {
        ArrayList<Contact> AllContacts = new ArrayList<Contact>();
        ContentResolver resolver = context.getContentResolver();
        // 要使用RawContacts.CONTACT_ID而不是Contacts.CONTACT_ID
        String[] PROJECTION = {
                RawContacts.CONTACT_ID, Contacts.DISPLAY_NAME,
                Contacts.LOOKUP_KEY, Contacts.PHOTO_THUMBNAIL_URI,
                Phone.NUMBER, Phone.TYPE, Contacts.STARRED
        };
        Cursor cursor = resolver.query(Phone.CONTENT_URI, PROJECTION, null,
                null, Contacts.SORT_KEY_PRIMARY);
        String preLookupKey = "";
        Contact preContact = null;
        if (cursor.moveToFirst()) {
            do {
                long contractID = cursor.getInt(0);
                String displayName = cursor.getString(1);
                String lookupKey = cursor.getString(2);
                String photoUri = cursor.getString(3);
                boolean starred = cursor.getInt(6) == 1;
                if (lookupKey.equals(preLookupKey) && preContact != null) {
                    preContact.addPhone(cursor.getString(4), cursor.getInt(5));
                } else {
                    Contact contact = new Contact();
                    contact.setContactId(contractID);
                    contact.setName(displayName);
                    contact.setLookupKey(lookupKey);
                    contact.setPhotoUri(photoUri);
                    contact.addPhone(cursor.getString(4), cursor.getInt(5));
                    contact.setStarred(starred);
                    AllContacts.add(contact);
                    preLookupKey = lookupKey;
                    preContact = contact;
                }
            } while (cursor.moveToNext());
        } else {
            // No Phone Number Found
        }
        cursor.close();
    }

2.讀取最近聯(lián)系人

    Android可以通過查詢Contacts.CONTENT_STREQUENT_URI得到最近聯(lián)系人。注意這里得到的不是歷史通話記錄,而是系統(tǒng)根據(jù)通話頻率自動獲得的。

public static void loadStrequent() {
	ArrayList<Contact> StrequentContacts = new ArrayList<Contact>();
	String[] projection = { Contacts._ID, Contacts.DISPLAY_NAME,
			Contacts.LOOKUP_KEY, Contacts.PHOTO_THUMBNAIL_URI,
			Contacts.TIMES_CONTACTED, Contacts.LAST_TIME_CONTACTED,
			Contacts.STARRED, Contacts.PHOTO_ID };
	ContentResolver resolver = AppApplication.globalApplication
			.getContentResolver();
	// 顯示最近聯(lián)系人和收藏的聯(lián)系人
	Cursor cursor = resolver.query(Contacts.CONTENT_STREQUENT_URI,
			projection, null, null, null);
	// 加載最近聯(lián)系人,不包括收藏的聯(lián)系人
	//Cursor cursor = resolver.query(
	//	Uri.withAppendedPath(Contacts.CONTENT_URI, "frequent"),
	//	projection, null, null, null);
	while (cursor.moveToNext()) {
		Contact contact = new Contact();
		long contractID = cursor.getInt(0);
		String displayName = cursor.getString(1);
		String lookupKey = cursor.getString(2);
		String photoUri = cursor.getString(3);
		int TIMES_CONTACTED = cursor.getInt(4);
		long LAST_TIME_CONTACTED = cursor.getLong(5);
		boolean starred = cursor.getInt(6) == 1;
		contact.setContactId(contractID);
		contact.setName(displayName);
		contact.setLookupKey(lookupKey);
		contact.setPhotoUri(photoUri);
		contact.setStarred(starred);
		contact.Times_Contacted = TIMES_CONTACTED;
		contact.Last_Time_Contacted = LAST_TIME_CONTACTED;
		StrequentContacts.add(contact);
	}
	cursor.close();
	// notify
}

3.讀取合并后的通話記錄。

    查詢Calls.CONTENT_URI,并不能讀取出具體的聯(lián)系人信息,如果要知道最近通話記錄,要跟已經(jīng)聯(lián)系人列表對照使用。

    public static void loadCallLogsCombined() {
        if (AllContacts.size() == 0) {
            loadContacts();
        }
        ArrayList<Contact> recentContacts = new ArrayList<Contact>();
        String[] projection = {
                Calls._ID, Calls.TYPE, Calls.CACHED_NAME,
                Calls.CACHED_NUMBER_TYPE, Calls.DATE, Calls.DURATION,
                Calls.NUMBER
        };
        ContentResolver resolver = AppApplication.globalApplication
                .getContentResolver();
        Cursor cursor = resolver.query(Calls.CONTENT_URI, projection, null,
                null, Calls.DEFAULT_SORT_ORDER);
        while (cursor.moveToNext()) {
            long callID = cursor.getInt(0);
            int callType = cursor.getInt(1);
            String name = cursor.getString(2);
            int numberType = cursor.getInt(3);
            long date = cursor.getLong(4);
            int duration = cursor.getInt(5);
            String number = cursor.getString(6);
            if (TextUtils.isEmpty(name)) {
                boolean matched = false;
                for (Iterator<Contact> iterator = recentContacts.iterator(); iterator
                        .hasNext();) {
                    Contact con = iterator.next();
                    if (con.Last_Contact_Number.equals(number)) {
                        matched = true;
                        con.Times_Contacted++;
                        break;
                    }
                }
                if (!matched) {
                    Contact tmpContact = new Contact();
                    tmpContact.Times_Contacted = 1;
                    tmpContact.Last_Contact_Call_ID = callID;
                    tmpContact.Last_Contact_Call_Type = callType;
                    tmpContact.Last_Contact_Number = number;
                    tmpContact.Last_Contact_Phone_Type = numberType;
                    tmpContact.Last_Time_Contacted = date;
                    tmpContact.Last_Contact_Duration = duration;
                    recentContacts.add(tmpContact);
                }
            } else {
                boolean matched = false;
                for (Iterator<Contact> iterator = recentContacts.iterator(); iterator
                        .hasNext();) {
                    Contact con = iterator.next();
                    if (con.Last_Contact_Number.equals(number)) {
                        matched = true;
                        con.Times_Contacted++;
                        break;
                    }
                }

                if (!matched) {
                    match3: for (Iterator<Contact> iterator = AllContacts
                            .iterator(); iterator.hasNext();) {
                        Contact con = iterator.next();
                        ArrayList<PhoneStruct> phones = con.getPhones();
                        for (Iterator<PhoneStruct> iterator2 = phones
                                .iterator(); iterator2.hasNext();) {
                            PhoneStruct phoneStruct = iterator2.next();
                            if (phoneStruct.phoneNumber.equals(number)) {
                                matched = true;
                                Contact tmpContact = con.clone();
                                tmpContact
                                        .setPhones(new ArrayList<Contact.PhoneStruct>());
                                tmpContact.Times_Contacted = 1;
                                tmpContact.Last_Contact_Call_ID = callID;
                                tmpContact.Last_Contact_Call_Type = callType;
                                tmpContact.Last_Contact_Number = number;
                                tmpContact.Last_Contact_Phone_Type = numberType;
                                tmpContact.Last_Time_Contacted = date;
                                tmpContact.Last_Contact_Duration = duration;
                                recentContacts.add(tmpContact);
                                break match3;
                            }
                        }
                    }
                }
            }
        }
        cursor.close();
    }


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI