本文主要使用contentprovider实现读取写入联系人数据,初步学习contentprovider的用法,[color=red]摘自李刚的《疯狂android》[/color]
contentprovider是不同应用程序之间进行数据交换的标准API,contentprovider以某种Uri的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用contentresolver根据Uri去访问操作指定数据。
如果把contentprovider当成一个“网站”来看,那木如何完整开发一个contentprovider呢?步骤很简单:
1.定义自己的contentprovider类,该类需要继承android提供的contentprovider基类。
2.想android系统注册这个“网站”,也就是早androidmanifest.xml文件中注册这个contentprovider,就像注册activity一样,注册contentprovider时需要为它绑定一个域名。
android系统提供了contacts应用程序来管理联系人,而且android系统还为联系人管理提供contentprovider,这就允许其他应用程序以contentprovider来管理联系人数据。
android系统对联系人管理contentprovider的几个Uri如下
[color=red]
ContactsContract.Contract.CONTENT_Uri:管理联系人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话的Uri.
ContactsContract.CommonDataKinds.Email.Content_URI: 管理联系人的E-mail的Uri
[/color]
知道联系人管理contentprovider的Uri之后,接下来就可在应用程序中通过contentresolver去操作系统的联系人数据了。
下面示例程序中包含两个按钮,一个按钮用于查询系统的联系人数据,一个按钮用于添加插入联系数据,具体代码如下:
1. main布局文件,由于测试学习使用,没有具体设计布局样式
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > android:id="@+id/querybtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="query"/> android:id="@+id/addbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="add"/> android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text"/> android:id="@+id/phone" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="phone"/> android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textEmailAddress"/>
2.result布局文件
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content"/>
3.实现代码如下:
import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; 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.view.Gravity; 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; public class MainActivity extends Activity { private Button querybtn, addbtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); querybtn = (Button)findViewById(R.id.querybtn); addbtn = (Button)findViewById(R.id.addbtn); querybtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //定义两个LIST来封装系统的联系人信息、指定联系人的电话号码,email等详情 final ArrayList names = new ArrayList(); final ArrayList> details = new ArrayList>(); //使用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 name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); names.add(name); //使用contentresolver查找联系人的电话号码 Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null); ArrayList detail = new ArrayList(); //遍历查询结果,获取该联系人的多个电话号码 while(phones.moveToNext()){ String phoneNumber = phones.getString(phones. getColumnIndex(ContactsContract. CommonDataKinds.Phone.NUMBER)); detail.add("电话号码:" + phoneNumber); } phones.close(); //使用contentresolver查找联系人的email的地址 Cursor emails = getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null); while(emails.moveToNext()){ String emailAdddress = emails.getString(emails .getColumnIndex(ContactsContract .CommonDataKinds.Email.DATA)); detail.add("邮件地址:" + emailAdddress); } emails.close(); details.add(detail); } cursor.close(); //加载result.xml界面布局代表的视图 View resultDialog = getLayoutInflater().inflate( R.layout.result, null); //获取resultDialog中ID 为list的ExpandableListView ExpandableListView list = (ExpandableListView)resultDialog.findViewById(R.id.list); ExpandableListAdapter adapter = new BaseExpandableListAdapter() { @Override public Object getChild(int groupPosition, int childPosition) { return details.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } @Override public int getChildrenCount(int groupPosition) { return details.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return names.get(groupPosition); } @Override public int getGroupCount() { return names.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(names.get(groupPosition).toString()); return textView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private TextView getTextView(){ AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setTextSize(20); return textView; } }; list.setAdapter(adapter); new AlertDialog.Builder(MainActivity.this) .setView(resultDialog) .setPositiveButton("确定", null) .show(); } }); addbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = ((EditText)findViewById(R.id.name)).getText().toString(); String phone = ((EditText)findViewById(R.id.phone)).getText().toString(); String email = ((EditText)findViewById(R.id.email)).getText().toString(); //创建一个空的contentvalues ContentValues values = new ContentValues(); //向rawContacts.Content_URI执行一个空值插入,目的是获取系统返回的rawContactId Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); //设置内容类型 values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); //设置联系人的名字 values.put(StructuredName.GIVEN_NAME, name); //向联系人Uri添加联系人名字 getContentResolver().insert(android.provider.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添加电话号码 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); //设置联系人的email地址 values.put(Email.DATA, email); //设置该电子邮件的类型 values.put(Email.TYPE, Email.TYPE_WORK); //向联系人email uri添加email数据 getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); Toast.makeText(MainActivity.this, "联系人数据添加成功", Toast.LENGTH_SHORT).show(); } }); } }
[color=red]
上面程序需要读取、添加联系人信息,因此需要在androidmanifest.xml中为该应用程序授权
[/color]
项目代码见附件