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()来打印你所有的列,然后去数据库中找寻相对应的值

相关文章推荐

Android - 四大组件之内容提供者,通知栏提醒Notification,短信,联系人数据库,内容观察者

Android - 四大组件之内容提供者,通知栏提醒Notification,短信,联系人数据库,内容观察者...

Android ContentProvider+获取系统联系人小Demo

什么是ContentProvider?简介 ContentProvider是安卓四大组件之一,用来共享应用程序内的数据,当你需要把你的应用程序的数据共享给其他应用程序的时候,才需要用到它,该组件对...

ContentProvider与隐式Intent获取手机联系人通讯录信息或电话的方法

ContentProvider与隐式Intent获取手机联系人通讯录信息或电话的方法

Android四大组件ContentProvider

  • 2016年08月31日 20:37
  • 10.06MB
  • 下载

Android中ContentProvider组件详解 .(查找sd卡上的歌曲和联系人)

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过Conte...

Android—ContentProvider读取系统联系人

我们主要是利用ContentProvider来共享其他程序的数据 需要借助ContentResolver类 这个类提供了一系列对数据处理的方法 读取联系人主要用到了查询方法,query();来看...

android系统ContentProvider——联系人

就做了个查询、添加联系人的例子,其他系统ContentProvider应该也差不多。 //查询联系人 public void query() { //获得Content...

26.获取系统联系人ContentProvider

1.实现获取联系人关键代码:     content://com.android.contacts/raw_contacts(获得联系人的id,姓名)     content://com.andr...

使用系统内置的ContentProvider获取非SIM卡的手机联系人

要使用系统的内置ContentProvider,首先得获取注册权限。           android:name="android.permission.READ_CONTACTS">    ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android四大组件之ContentProvider获取系统的联系人及联系人电话
举报原因:
原因补充:

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