使用ContentProvider管理連絡人

來源:互聯網
上載者:User

Android系統提供了Contacts應用程式來管理連絡人,而且還為連絡人管理提供了ContentProvider。

下面通過一個執行個體來示範,實現查詢系統所有連絡人的姓名及其詳細資料和新增連絡人...,代碼如下:

讀取連絡人的Activity:

package com.lovo.activity;import java.util.ArrayList;import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseExpandableListAdapter;import android.widget.Button;import android.widget.ExpandableListView;import android.widget.TextView;import com.lovo.lesson15.R;/** * 讀取連絡人的Activity *  * @author Administrator *  */public class ReadContactActivity extends Activity {/** * 儲存連絡人的姓名集合 */private ArrayList<String> namesList = new ArrayList<String>();/** * 儲存連絡人詳細資料的集合 */private ArrayList<ArrayList<String>> infoList = new ArrayList<ArrayList<String>>();private ExpandableListView elv;private Button addContactBtn;private BaseExpandableListAdapter adapter;/** * 初始化集合 */public void initData() {namesList.clear();infoList.clear();// 查詢連絡人的基本資料// 系統連絡人的URI:ContactsContract.Contacts.CONTENT_URICursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {// 擷取連絡人的IDint contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));// 擷取連絡人的姓名String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));namesList.add(name);// 存放每個連絡人裡面詳細資料的集合,裡面有電話號碼和emailArrayList detailList = new ArrayList();// 尋找電話號碼// 擷取系統連絡人電話號碼的URI:ContactsContract.CommonDataKinds.Phone.CONTENT_URI// 電話號碼資料中對應連絡人的ID列名:ContactsContract.CommonDataKinds.Phone.CONTACT_IDCursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="+ contactId, null, null);while (phoneCursor.moveToNext()) {String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));detailList.add(phoneNumber);}phoneCursor.close();// 尋找連絡人的email// 擷取連絡人email的URI:ContactsContract.CommonDataKinds.Email.CONTENT_URI// email資料中對應連絡人的ID列名:ContactsContract.CommonDataKinds.Email.CONTACT_IDCursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + "="+ contactId, null, null);while (emailCursor.moveToNext()) {String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));detailList.add(email);}emailCursor.close();infoList.add(detailList);}cursor.close();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.read_contact_main);initData();elv = (ExpandableListView) findViewById(R.id.read_contact_main_elv);addContactBtn = (Button) findViewById(R.id.read_contact_main_btn_add);addContactBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(ReadContactActivity.this,SaveContactActivity.class);startActivity(intent);}});adapter = new BaseExpandableListAdapter() {@Overridepublic boolean isChildSelectable(int groupPosition,int childPosition) {return true;}@Overridepublic boolean hasStableIds() {return true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {TextView tv = new TextView(ReadContactActivity.this);tv.setText(namesList.get(groupPosition));tv.setPadding(50, 10, 10, 10);return tv;}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic int getGroupCount() {return namesList.size();}@Overridepublic Object getGroup(int groupPosition) {return namesList.get(groupPosition);}@Overridepublic int getChildrenCount(int groupPosition) {return infoList.get(groupPosition).size();}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {TextView tv = new TextView(ReadContactActivity.this);tv.setText(infoList.get(groupPosition).get(childPosition));tv.setPadding(10, 10, 10, 10);return tv;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic Object getChild(int groupPosition, int childPosition) {return infoList.get(groupPosition).get(childPosition);}};elv.setAdapter(adapter);}// 新增連絡人...完成後回調此方法,更新adapter資料@Overrideprotected void onResume() {super.onResume();initData();adapter.notifyDataSetChanged();}}

讀取連絡人的布局XML:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/read_contact_main_btn_add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="增加" />    <ExpandableListView        android:id="@+id/read_contact_main_elv"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </ExpandableListView></LinearLayout>

增加連絡人的Activity:

package com.lovo.activity;import android.app.Activity;import android.content.ContentUris;import android.content.ContentValues;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.Data;import android.provider.ContactsContract.RawContacts;import android.view.View;import android.widget.EditText;import com.lovo.lesson15.R;public class SaveContactActivity extends Activity {private EditText nameText;private EditText phoneText;private EditText emailText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.add_contact_main);nameText = (EditText) findViewById(R.id.add_contact_main_et_name);phoneText = (EditText) findViewById(R.id.add_contact_main_et_phone);emailText = (EditText) findViewById(R.id.add_contact_main_et_email);}public void click(View v) {if (v.getId() == R.id.add_contact_main_btn_ok) {ContentValues values = new ContentValues();// 添加一條空資料並擷取其ID,此ID為當前增加的連絡人IDUri uri = getContentResolver().insert(RawContacts.CONTENT_URI,values);// 使用工具類ContentUris來解析Uri中的IDlong contactId = ContentUris.parseId(uri);// 新增連絡人...的姓名if (nameText.getText() != null&& !"".equals(nameText.getText().toString().trim())) {// 將ContentValues裡面的所有內容清空values.clear();// 增加連絡人IDvalues.put(Data.RAW_CONTACT_ID, contactId);// 指定要新增連絡人...姓名的MIME類型values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);// 指定要新增連絡人...的姓名values.put(StructuredName.GIVEN_NAME, nameText.getText().toString());// 新增連絡人...的姓名getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);}// 新增連絡人...的電話if (phoneText.getText() != null&& !"".equals(phoneText.getText().toString().trim())) {// 將ContentValues裡面的所有內容清空values.clear();// 增加連絡人IDvalues.put(Data.RAW_CONTACT_ID, contactId);// 指定要新增連絡人...電話的MIME類型values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);// 指定要添加的連絡人電話的類型values.put(Phone.TYPE, Phone.TYPE_MOBILE);// 制定要新增連絡人...的電話values.put(Phone.NUMBER, phoneText.getText().toString());// 新增連絡人...的電話getContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);}// 新增連絡人...的emailif (emailText.getText() != null&& !"".equals(emailText.getText().toString().trim())) {// 將ContentValues裡面的所有內容清空values.clear();// 增加連絡人IDvalues.put(Data.RAW_CONTACT_ID, contactId);// 指定要新增連絡人...email的MIME類型values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);// 指定要添加的連絡人email的類型values.put(Email.TYPE, Email.TYPE_HOME);// 指定要添加的連絡人的emailvalues.put(Email.DATA, emailText.getText().toString());// 新增連絡人...的emailgetContentResolver().insert(ContactsContract.Data.CONTENT_URI,values);}finish();}if (v.getId() == R.id.add_contact_main_btn_back) {finish();}}}

增加連絡人的布局XML:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="連絡人的姓名" />    <EditText        android:id="@+id/add_contact_main_et_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:ems="10" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="連絡人的電話" />    <EditText        android:id="@+id/add_contact_main_et_phone"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:ems="10" />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="連絡人的email" />    <EditText        android:id="@+id/add_contact_main_et_email"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:ems="10" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_horizontal"        android:orientation="horizontal" >        <Button            android:id="@+id/add_contact_main_btn_ok"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:onClick="click"            android:text="儲存" />        <Button            android:id="@+id/add_contact_main_btn_back"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="20dp"            android:onClick="click"            android:text="返回" />    </LinearLayout></LinearLayout>

要讀取系統連絡人,不要忘了加上如下許可權:

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.