最近在做手機聯系人的功能模塊的時候,遇到了很多的坑,在網上搜索的有一些所謂的最全的手機聯系人開發的介紹還存在一些bug,所以我把我最近的項目心得和方法寫下來,既能幫助大家減少了解android/203963.html">android開發手機聯系人的門檻,好,廢話少說,接下來直奔主題。
一、深入淺出手機聯系人的前奏(小米手機的data表跟模擬器的data表不一樣)
1、手機聯系人主要是對contacts2.db數據庫表的操縱,這個數據庫中有三個表是比較重要的,分別是data,raw_contacts,mimetyps這三個表。在下面的增刪查改模塊中,主要是根據表之間的關系來關聯的處理的。
1.1、data表

1.2、mimetypes表

1.3、raw_contacts表

1.4、下載contacts2.db表的方法
在eclipse中打開android模擬器,在eclipse導航欄的window->show View->other..->File Explorer.單擊eclipse導航欄右上角的DDMS,File Explorer 下的data->data->com.android.providers.contact->databases下就有contacts2.db數據庫了。單擊然后保存就可以了。

2、深入淺出之手機聯系人查詢模塊
/** * 通過輸入獲取電話號碼 */ public void number(String name1,long rawContactId) { //使用ContentResolver查找聯系人數據 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //遍歷查詢結果,找到所需號碼 while (cursor.moveToNext()) { //獲取聯系人ID String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); //獲取聯系人的名字 String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); if (name1.equals(contactName)) { //使用ContentResolver查找聯系人的電話號碼和用戶名 Cursor phone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); if (phone.moveToNext()) { String phoneNumber1 = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));//電話號碼 String phoneName1 = phone.getString(phone.getColumnIndex(Phone.DISPLAY_NAME));//姓名 phoneNumber.setText(phoneNumber1); name.setText(phoneName1); } //獲取郵箱信息 Cursor emails =getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId,null,null); while(emails.moveToNext()){ String emailAddress =emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); email.setText(emailAddress); } //獲取IM信息 Cursor cursorQQ =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id=2",null,null); while(cursorQQ.moveToNext()){ //獲取公司信息 String im1 = cursorQQ.getString(cursorQQ.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); qq.setText(im1); } //獲取公司信息 Cursor cursorCompany =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id = 4",null,null); while(cursorCompany.moveToNext()){ String company1=cursorCompany.getString(cursorCompany.getColumnIndex("data1")); String position1=cursorCompany.getString(cursorCompany.getColumnIndex("data4")); position.setText(position1); company.setText(company1); } } }}3、深入淺出之手機聯系人增加模塊
//增加聯系人 public void addContact(String name, String phoneNumber,String email,String company,String position,String im) { /* 往 raw_contacts 中添加數據,并獲取添加的id號*/ /* 往 raw_contacts 中添加數據,并獲取添加的id號*/ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentValues values = new ContentValues(); long rawContactId= ContentUris.parseId(resolver.insert(uri, values)); //插入data表 uri = Uri.parse("content://com.android.contacts/data"); // 向data表插入數據 if (name != "") { values.put("raw_contact_id", rawContactId); values.put("mimetype", "vnd.android.cursor.item/name"); values.put("data2", name); resolver.insert(uri, values); } // 向data表插入電話號碼 if ( phoneNumber != "") { values.clear(); values.put("raw_contact_id", rawContactId); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("data2", "2"); values.put("data1", phoneNumber); resolver.insert(uri, values); } //向data表中插入郵箱 if (email!= "") { // 添加Email values.clear(); values.put("raw_contact_id", rawContactId); values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); values.put(Email.DATA, email); values.put(Email.TYPE, Email.TYPE_WORK); resolver.insert(uri, values); } //向data表中插入聯系人的組織 if(company!=""&&position!=""){ //organization values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Organization.MIMETYPE, Organization.CONTENT_ITEM_TYPE); values.put(Organization.LABEL, name); values.put(Organization.TITLE, position); values.put(Organization.COMPANY, company); values.put(Organization.TYPE,Organization.TYPE_WORK); context.getContentResolver().insert(uri, values); } //向data表中插入聯系人的QQ if(im!=""){ //im values.clear(); values.put("raw_contact_id", rawContactId); values.put("mimetype", "vnd.android.cursor.item/im"); values.put(Im.DATA, im); values.put(Im.TYPE, Im.TYPE_WORK); resolver.insert(uri, values); } } 4、深入淺出之手機聯系人更新模塊
// 更新聯系人 public void updataContact(long rawContactId,String name,String number,String email,String company,String position,String im) { Uri uri = Uri.parse("content://com.android.contacts/data");//對data表的所有數據操作 ContentValues values = new ContentValues(); //更新電話號碼 values.put("data1", number); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"5", rawContactId+""}) ; //更新聯系人姓名 values.clear(); values.put("data1", name); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"7", rawContactId+""}) ; //更新email values.clear(); values.put("data1", email); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"1", rawContactId+""}) ; //更新im values.clear(); values.put("data1", im); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"2", rawContactId+""}) ; //更新company values.clear(); values.put("data1", company); values.put("data3",name); values.put("data4",position); resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"4", rawContactId+""}) ; } 5、深入淺出之手機聯系人刪除模塊
// 刪除聯系人 public void deleteContact(long rawContactId) { Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Cursor cursor = resolver.query(uri,new String[]{RawContacts._ID},"contact_id=?",new String[]{String.valueOf(rawContactId) }, null ); if(cursor.moveToFirst()){ int id = cursor.getInt(0); resolver.delete(uri, "_id=?",new String[]{id+""}); uri = Uri.parse("content://com.android.contacts/data"); resolver.delete(uri, "raw_contact_id=?",new String[]{id+""}); cursor.close(); } } 6、大話自制手機聯系人軟件與系統手機聯系人軟件的區別
6.1、系統的手機聯系人軟件在刪除單個聯系人的時候不是直接刪除的,然是通過把某個值設置為0,使得該手機聯系人信息不可見,根據網上的大多數實例都是直接把data數據庫表中的單個聯系人的信息直接delete了。
新聞熱點
疑難解答