標籤:
Android提供了Contacts應用程式來管理連絡人,並且Android系統還為連絡人管理提供了ContentProvider,這就同意其他應用程式以ContentResolver來管理連絡人資料。
關於ContentProvider、ContentResolver和Uri具體解釋大家能夠參考http://blog.csdn.net/fengyuzhengfan/article/details/37743963。這裡就不在過多的陳述了。
先送上執行個體執行:
在對連絡人進行操作之前,先讓我們瞭解一下通訊錄資料庫裡面基本的幾張表:
1) RawContacts:存放連絡人的ID,_id屬性為主鍵,聲明為autoincrement。即不須要手動設定,其它屬性也不須要手動設定就有預設值;
2) mimetypes:存放資料的類型。比方"vnd.android.cursor.item/name"表示“姓名”類型的資料,"vnd.android.cursor.item/phone_v2"表示“電話”類型的資料;
欄位名 |
說明 |
電話 |
vnd.android.cursor.item/phone_v2 |
姓名 |
vnd.android.cursor.item/name |
郵件 |
vnd.android.cursor.item/email_v2 |
通訊地址 |
vnd.android.cursor.item/postal-address_v2 |
組織 |
vnd.android.cursor.item/organization |
照片 |
vnd.android.cursor.item/photo |
3) data 存放詳細的資料。
欄位名 |
說明 |
Data._ID |
"_id" |
Data.DISPLAY_NAME |
“display_name” |
Data.DATA1 |
“data1” |
Data.DATA2 |
“data2” |
Data.RAW_CONTACT_ID |
“raw_contact_id” |
Data.MIMETYPE |
“mimetype” |
4) raw_contact_id屬性用來串連raw_contacts表,每條記錄表示一個詳細資料;我們基本的資料(email、phone等)都存放在data表;
5) StructuredName 中主要儲存的是連絡人姓名。其稱呼名和其拼音名。
當我們向通訊錄資料庫中插入連絡人的時候。通常是先往RawContacts表插入一行空值以獲得返回的rawContactId也就是連絡人ID,之後再依據這個ID陸續向Data表中插入連絡人的姓名、電話、以及Email等資訊。
應用執行個體:
package com.jph.contactproviderdemo;import java.util.ArrayList;import android.net.Uri;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Email;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.StructuredName;import android.provider.ContactsContract.Contacts.Data;import android.provider.ContactsContract.RawContacts;import android.app.Activity;import android.app.AlertDialog;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.BaseExpandableListAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ExpandableListAdapter;import android.widget.ExpandableListView;import android.widget.TextView;import android.widget.Toast;/** * Describe:</br> * 通過ContenPprovider管理的連絡人</br> * 本執行個體主要實現了連絡人的加入與查詢</br> * @author JPH * Date:2014.07.15 * */public class ContactProviderDemo extends Activity {ContentResolver resolver;Button btnSelect,btnAdd;EditText edtName,edtPhone,edtEmail;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnAdd=(Button)findViewById(R.id.add);btnSelect=(Button)findViewById(R.id.search);edtEmail=(EditText)findViewById(R.id.email);edtName=(EditText)findViewById(R.id.name);edtPhone=(EditText)findViewById(R.id.phone);//擷取ContentResolver對象resolver=getContentResolver();/*******************************************查詢連絡人***************************************************/btnSelect.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//定義兩個ArrayList用於存放連絡人的資訊final ArrayList<String>username=new ArrayList<String>();final ArrayList<ArrayList<String>>details=new ArrayList<ArrayList<String>>();//查詢連絡人資料Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);//遍曆cursor取出連絡人姓名及IDwhile (cursor.moveToNext()) {//擷取連絡人姓名String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));//擷取聯絡IDString contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));username.add(name);//查詢連絡人電話號碼Cursor phones=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);//定義一個detail列表數組用於存放連絡人的電話號碼和EmailArrayList<String>detail=new ArrayList<String>();//遍曆查詢結果,擷取該連絡人的多個電話號碼while (phones.moveToNext()) {String phonenumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));detail.add("電話號碼:"+phonenumber);}phones.close();//關閉phones遊標回收資源//查詢連絡人EmailCursor emails=resolver.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));detail.add("Email:"+emailAddress);}emails.close();//關閉emails遊標回收資源details.add(detail);}cursor.close();//載入result.xml布局介面代表的視圖View view=getLayoutInflater().inflate(R.layout.result, null);//擷取view中的ExpandableListView組件ExpandableListView list=(ExpandableListView) view.findViewById(R.id.list);//建立ExpandableListAdapter為list填充資料ExpandableListAdapter adapter=new BaseExpandableListAdapter() {//定義一個顯示連絡人資訊的TextViewTextView geTextView(){TextView textView=new TextView(ContactProviderDemo.this);AbsListView.LayoutParams lp=new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,64);textView.setLayoutParams(lp);textView.setPadding(36, 0, 0, 0);textView.setTextSize(20);return textView;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn true;}@Overridepublic boolean hasStableIds() {// TODO Auto-generated method stubreturn true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView textView=geTextView();textView.setText(getGroup(groupPosition).toString());return textView;}@Overridepublic long getGroupId(int groupPosition) {// TODO Auto-generated method stubreturn groupPosition;}@Overridepublic int getGroupCount() {// TODO Auto-generated method stubreturn username.size();}@Overridepublic Object getGroup(int groupPosition) {// TODO Auto-generated method stubreturn username.get(groupPosition);}@Overridepublic int getChildrenCount(int groupPosition) {// TODO Auto-generated method stubreturn details.get(groupPosition).size();}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView textView=geTextView();textView.setText(getChild(groupPosition, childPosition).toString());return textView;}@Overridepublic long getChildId(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn childPosition;}@Overridepublic Object getChild(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn details.get(groupPosition).get(childPosition);}};//為ExpandableListView設定ExpandableListAdapterlist.setAdapter(adapter);//建立對話方塊顯示查詢結果new AlertDialog.Builder(ContactProviderDemo.this).setView(view).setPositiveButton("確定", null).show();}});/*******************************************加入連絡人***************************************************/btnAdd.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//擷取使用者輸入的連絡人資訊String name=edtName.getText().toString();String phone=edtPhone.getText().toString();String email=edtEmail.getText().toString();//定義一個ContentValuesContentValues values=new ContentValues();//向RawContacts.CONTENT_URI插入空值以獲得返回的rawContactIdUri uri=resolver.insert(RawContacts.CONTENT_URI, values);//解析出rawContactIdlong rawContactId=ContentUris.parseId(uri);values.clear();/**********加入連絡人的姓名*************///設定連絡人Idvalues.put(Data.RAW_CONTACT_ID, rawContactId);//設定內容類型values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//設定連絡人姓名(StructuredName中儲存的是連絡人姓名,其稱呼名和其拼音名)values.put(StructuredName.DISPLAY_NAME, name);//向連絡人URi加入連絡人姓名resolver.insert(ContactsContract.Data.CONTENT_URI, values);values.clear();/**********加入連絡人電話號碼*************/values.put(Data.RAW_CONTACT_ID, rawContactId);//設定內容類型values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);//設定連絡人電話values.put(Phone.NUMBER, phone);//設定連絡人電話類型values.put(Phone.TYPE, Phone.TYPE_MOBILE);//向連絡人URi加入電話號碼resolver.insert(ContactsContract.Data.CONTENT_URI, values);values.clear();/**********加入連絡人Email*************///設定連絡人Idvalues.put(Data.RAW_CONTACT_ID, rawContactId);//設定內容類型values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);//設定連絡人Emailvalues.put(Email.DATA,email);//向連絡人URi加入連絡人姓名resolver.insert(ContactsContract.Data.CONTENT_URI, values);Toast.makeText(ContactProviderDemo.this, "加入連絡人成功", Toast.LENGTH_SHORT).show();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.contact_provider_demo, menu);return true;}}
管理Android通訊錄