由于代码上注释写的很清楚,可以直接运行成功。所以我就不说什么了,这个例子是疯狂android讲义上的范例,大家有书的可以看看,那本书挺不错的。ContentProvider是很重要的,但是一般不做系统级开发的不会涉及到,我纯粹是为了练习使用它。
package com.example.democontent; import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.database.Cursor; import android.graphics.Color; import android.os.Bundle; import android.provider.ContactsContract; 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.ExpandableListView; import android.widget.TextView; public class MainActivity extends Activity { private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { allContants(); } }); } private void allContants() { final ArrayList<String> names = new ArrayList<String>(); final ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>(); 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); // 联系人的多个电话 Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null); ArrayList<String> detail = new ArrayList<String>(); // 遍历插叙结果获取该联系人的多个电话号码 while (phones.moveToNext()) { String phoneNumber = phones .getString(phones .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); detail.add("电话号码:" + phoneNumber); } phones.close(); // 查找email Cursor emails = getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null, null); // 遍历查询结果,获取多个联系人的email while (emails.moveToNext()) { String emailAddress = emails .getString(emails .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); detail.add("邮件地址:" + emailAddress); } emails.close(); details.add(detail); } cursor.close(); // 加载result.xml界面布局代表的试图 View resultDialog = getLayoutInflater().inflate(R.layout.result, null); // 获取加载视图上的id ExpandableListView list = (ExpandableListView) resultDialog .findViewById(R.id.expandableListView1); // 获取视图当中的ExpandableListView对象 BaseExpandableListAdapter adapter = new BaseExpandableListAdapter() { // 自定义的得到TextView的方法 private TextView getTextView() { AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 64); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(36, 0, 0, 0); textView.setTextSize(20); textView.setTextColor(Color.RED); return textView; } // 子选项是否被选中 public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } // 是否有固定的id public boolean hasStableIds() { // TODO Auto-generated method stub return true; } // 该方法决定每个组选项的外观,返回的是自定义的TextView public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); return textView; } // 得到组的id号 public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } // 得到组的个数 public int getGroupCount() { // TODO Auto-generated method stub return names.size(); } // 得到组 public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return names.get(groupPosition); } // 得到组的二级列表的个数 public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return details.get(groupPosition).size(); } // 得到组的二级列表视图 public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition) .toString()); return textView; } // 得到组的二级列表的id号 public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } // 得到组的二级列表中的一个元素 public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return details.get(groupPosition).get(childPosition); } }; list.setAdapter(adapter); new AlertDialog.Builder(MainActivity.this).setView(resultDialog) .setPositiveButton("确定", null).show(); } }
main.xml布局文件只有一个按钮
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="所有人信息" /> </RelativeLayout>
result.xml布局文件如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ExpandableListView android:id="@+id/expandableListView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ExpandableListView> </LinearLayout>
重要的权限问题哈
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" />