使用ContentProvider 管理联系人

Android 系统提供了Contacts应用程序来管理联系人,而且 Android系统还为联系人管理提供了ContentProvider ,这就允许其他应用程序以ContentResolver来管理联系人数据.


Android系统对联系人管理ContentProvider 的几个Uri如下:

  1. ContactsContract.Contacts.CONTENT_URI :管理联系人的Uri.
  2. ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人电话的Uri.
  3. ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理联系人Email的Uri.

package com.test.contentprovidersystem;

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.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
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;

import java.util.ArrayList;

/**
 * 使用ContentProvider 管理联系人
 */
public class ContentProviderSystem extends AppCompatActivity {
    Button search;
    Button add;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content_provider_system);

        search = (Button) findViewById(R.id.search);
        add = (Button) findViewById(R.id.add);
        initListener();
    }

    private void initListener() {
        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //定义两个 List集合来封装系统联系人信息,指定联系人号码,Email等详情
                final ArrayList<String> names = new ArrayList<String>();
                final ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>();

                //使用 ContentResolver 查询联系人数据
                Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

                //遍历查询结果.获取系统所有的联系人
                while (cursor.moveToNext()) {
                    //获取联系人 ID
                    String contentID = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

                    //获取联系人的 名字
                    String contentName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    names.add(contentName);

                    //使用ContentResolver 查找联系人的电话号码
                    Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contentID, null, null);

                    ArrayList<String> detail = new ArrayList<String>();
                    //遍历查询结果,获取该联系人的多个电话号码
                    while (cursorPhone.moveToNext()) {
                        //获取查询结果中的电话号码列中的数据
                        String phoneNumber = cursorPhone.getString(
                                cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        detail.add(phoneNumber);
                    }
                    cursorPhone.close();

                    //使用ContentResolver 查找联系人的Email 地址
                    Cursor cursorEmail = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contentID, null, null);

                    //遍历查询 cursorEmail 获取该联系人的多个 Email 地址
                    while (cursorEmail.moveToNext()) {
                        //获取查询结果中 Email 地址列中数据
                        String emailAddress = cursorEmail.getString(
                                cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        detail.add(emailAddress);

                    }
                    cursorEmail.close();
                    details.add(detail);

                }
                cursor.close();

                //加载结果布局界面
                View resultDialog = getLayoutInflater().inflate(R.layout.result, null);

                ExpandableListView list = (ExpandableListView) resultDialog.findViewById(R.id.list);

                //创建 ExpandableListAdapter对象
                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 int getChildrenCount(int groupPosition) {
                        return details.get(groupPosition).size();
                    }

                    private TextView getTextView() {
                        AbsListView.LayoutParams lp = new AbsListView
                                .LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT
                                , 64);
                        TextView textView = new TextView(
                                ContentProviderSystem.this);
                        textView.setLayoutParams(lp);
                        textView.setGravity(Gravity.CENTER_VERTICAL
                                | Gravity.LEFT);
                        textView.setPadding(36, 0, 0, 0);
                        textView.setTextSize(20);
                        return textView;
                    }

                    // 该方法决定每个子选项的外观
                    @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 String 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 text = getTextView();
                        text.setText(getGroup(groupPosition).toString());
                        return text;
                    }

                    @Override
                    public boolean isChildSelectable(int groupPosition, int childPosition) {
                        return true;
                    }

                    @Override
                    public boolean hasStableIds() {
                        return true;
                    }
                };
                // 为ExpandableListView设置Adapter对象
                list.setAdapter(adapter);
                // 使用对话框来显示查询结果。
                new AlertDialog.Builder(ContentProviderSystem.this)
                        .setView(resultDialog).setPositiveButton("确定", null).show();
            }
        });
        // 为add按钮的单击事件绑定监听器
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 获取程序界面中的3个文本框
                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(
                        ContactsContract.RawContacts.CONTENT_URI, values);
                long rawContactId = ContentUris.parseId(rawContactUri);
                values.clear();
                values.put(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId);
                // 设置内容类型
                values
                        .put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
                // 设置联系人名字
                values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
                // 向联系人URI添加联系人名字
                getContentResolver().insert(
                        android.provider.ContactsContract.Data.CONTENT_URI,
                        values);
                values.clear();
                values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
                values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                // 设置联系人的电话号码
                values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
                // 设置电话类型
                values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
                // 向联系人电话号码URI添加电话号码
                getContentResolver().insert(
                        android.provider.ContactsContract.Data.CONTENT_URI,
                        values);
                values.clear();
                values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
                values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
                // 设置联系人的Email地址
                values.put(ContactsContract.CommonDataKinds.Email.DATA, email);
                // 设置该电子邮件的类型
                values.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
                // 向联系人Email URI添加Email数据
                getContentResolver().insert(
                        android.provider.ContactsContract.Data.CONTENT_URI,
                        values);
                Toast.makeText(ContentProviderSystem.this, "联系人数据添加成功",
                        Toast.LENGTH_LONG).show();
            }
        });
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        >
        <Button
            android:id="@+id/search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/search"
            />
        <Button
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/add"
            />
    </LinearLayout>
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/name"
        />
    <EditText
        android:id="@+id/name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/phone"
        />
    <EditText
        android:id="@+id/phone"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:phoneNumber="true"
        />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/email"
        />
    <EditText
        android:id="@+id/email"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

dialog布局文件

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    >
    <ExpandableListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:childIndicator="@drawable/user"
        />
</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值