Android四大组件之ContentProvider获取系统的联系人及联系人电话

原创 2016年08月29日 23:03:06

内容提供者ContentProvider

ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider

1、ContentProvider使用表的形式来组织数据
   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法
   query:查询   insert:插入   update:更新   delete:删除   getType:得到数据类型
   onCreate:创建数据时调用的回调函数
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包中

这里主要说下怎么通过ContentResolver来获取系统联系人

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import read.liu.com.servicedemo.LogD;
import read.liu.com.servicedemo.R;

public class ContentProviderActivity extends AppCompatActivity {
    private ContentResolver contentResolver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content_provider);
        contentResolver = getContentResolver();
        getPeopleTel();
    }

    private void getPeopleTel() {
        Uri uri = Uri.parse("content://com.android.contacts/contacts");//看下方的解释
        Cursor cursor = contentResolver.query(uri, null, null, null, null);
        //遍历从contacts数据表中的数据集
        while (cursor.moveToNext()) {
            StringBuilder sb = new StringBuilder();
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            //得到联系人姓名
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            LogD.d(contactId + ":" + name);
            //获取联系人手机号码
            Cursor numberCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                    , null
                    , ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId
                    , null
                    , null);
            while (numberCursor.moveToNext()) {
                String phoneNum = numberCursor.getString(numberCursor.getColumnIndex("data1"));
                LogD.d(phoneNum);
            }
            //获取联系人邮箱
//            Cursor emails = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
//                    null,
//                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
//                    null, null);
        }
    }
}
添加联系人【参考别人的】
/**
     * 批量添加联系人,处于同一个事务中
     */
    public void testSave() throws Throwable{
        //文档位置:reference\android\provider\ContactsContract.RawContacts.html
        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        int rawContactInsertIndex = 0;
        ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                .withValue(RawContacts.ACCOUNT_TYPE, null)
                .withValue(RawContacts.ACCOUNT_NAME, null)
                .build());
        
        //文档位置:reference\android\provider\ContactsContract.Data.html
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.GIVEN_NAME, "lisi")
                .build());
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                 .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
                 .withValue(Phone.NUMBER, "5556")
                 .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
                 .withValue(Phone.LABEL, "")
                 .build());
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                 .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
                 .withValue(Email.DATA, "lisi@126.cn")
                 .withValue(Email.TYPE, Email.TYPE_WORK)
                 .build());
        
        ContentProviderResult[] results = this.getContext()
                .getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
        for (ContentProviderResult result : results) {
            Log.i(TAG, result.uri.toString());
        }
    }

contacts表也就是联系人表的URI —— scontent://com.android.contacts/contact ,对应类静态常量为ContactsContract.Contacts.CONTENT_URI
联系人电话URI —— content://com.android.contacts/data/phones ,对应静态常量为ContactsContract.CommonDataKinds.Phone.CONTENT_URI
联系人邮箱URI —— content://com.android.contacts/data/emails  ,对应静态常量为ContactsContract.CommonDataKinds.Email.CONTENT_URI
联系人地址URI —— content://com.android.contacts/data/postals  ,对应静态常量为ContactsContract.CommonDataKinds.StructuredPostall.CONTENT_URI
所有联系人的Uri —— content://contacts/people
某个联系人x的Ur —— content://contacts/people/x
data表URI —— content://com.Android.contacts/data ,对应静态常量为ContactsContract.Data.CONTENT_URI
通过  content://com.android.contacts/contacts ,你就可以查找contacts表
其中比较重要的字段有:_id-->联系人的ID
通过  content://com.android.contacts/data 你就可以查询data表
row_contact_id-->联系人的id地址
data1-->所存在联系人的名字、邮箱和出生地
data2-->指明数据的类型(一个int型,相当于mineetypes的id)。eg vnd.android.cursor.item/email_v2
minetypes-->指明具体的数据的类型
当你不知道你表中有多少数据的时候,最好就是通过cursor.getColumnnames()来打印你所有的列,然后去数据库中找寻相对应的值

利用ContentProvider获取联系人列表

最近学习了Android四大组件之一的ContentProvider,Android系统通过ContentProvider为应用程序之间共享数据提供了统一的接口。 Android已经为常见的一些数据...
  • geekv
  • geekv
  • 2016年01月31日 19:24
  • 929

Android -ContentProvider之获取手机联系人

在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家...
  • qiuqiu_qiuqiu123
  • qiuqiu_qiuqiu123
  • 2017年02月11日 15:17
  • 1113

利用ContentProvider实现查看、添加系统联系人

一、ContentProvider是不同应用程序之间进行数据交换的标准API 开发ContentProvider的步骤: 1、定义自己的ContentProvider类继承Android提供的Co...
  • u011521890
  • u011521890
  • 2015年09月28日 21:04
  • 958

Android:ContentProvider获取手机联系人列表

这次带来的是手机通讯录常用字段的展示直接上代码,看注释:activity_main.xml: ...
  • James_lang
  • James_lang
  • 2017年02月22日 02:00
  • 2320

Android ContentProvider之联系人数据库及操作

通讯录数据库的主要表之间架构关系: 第一层:Data层,每种独立的数据类型占一行。具体哪些独立的数据可以占一行,可以在mimetypes这张表中找到, 原生Android的系统 一共12...
  • u011240877
  • u011240877
  • 2015年03月24日 17:04
  • 1239

使用ContentProvider 管理联系人

Android 系统提供了Contacts应用程序来管理联系人,而且 Android系统还为联系人管理提供了ContentProvider ,这就允许其他应用程序以ContentResolver来...
  • blueshell001
  • blueshell001
  • 2016年06月28日 16:47
  • 413

Android ContentProvider 之查看/读取手机联系人

Android ContentProvider 之查看/读取手机联系人 看到某些App里面有读取联系人的功能,然后自己尝试了一下。发现这个挺简单的。然后自己就做了一个demo给大家,希望借这个dem...
  • via_myra
  • via_myra
  • 2017年02月09日 19:15
  • 213

Android从SIM卡中获取联系人信息

Uri uri = Uri.parse("content://icc/adn"); String[] projection = {"_id", "name", "number"}; Curso...
  • jaycee110905
  • jaycee110905
  • 2013年02月22日 23:33
  • 3141

android:获取联系人原理(姓名和电话)详解

原文地址:http://www.ginchenorlee.com/?p=236&replytoc 最近在弄安卓联系人, 网上有很多资料,但是都很冗杂,经过自己的深层摸索,写下自己的学习心得: 讲2...
  • u013337743
  • u013337743
  • 2015年04月26日 14:39
  • 2327

android之选择联系人并返回电话号码

转自:http://blog.csdn.net/jason0539 在跟着这个教程联系的时候,它所用到的选择联系人方式是自己从数据库里把联系人读取出来,然后用listview显示,选择后返回手机...
  • qq_27489007
  • qq_27489007
  • 2016年08月11日 23:05
  • 1290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android四大组件之ContentProvider获取系统的联系人及联系人电话
举报原因:
原因补充:

(最多只允许输入30个字)