以获取和添加联系人为例学习调用系统ContentPrivider

以获取和添加联系人为例,学习调用系统提供的ContentProvider

安卓系统在做联系人这个APP的时候,就已经提供好了一个联系人的ContentProvider。

包括3个表

1.raw_contacts表

Contact_id存放联系人的id

该表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

2.data表

这个表用来储存所有的联系人的详细信息的

一个联系人的信息可能存在多条数据,其中比较重要的字段是数据类型,联系人id,还有数据内容,

其中有一个字段mime_type是数据类型(电话,邮箱,名字)

3.mimeType表

就是联系人所有的数据库类型选项

代码部分,布局未列出。

package com.user.android2_lesson_06_systemcontentprivider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * 调用系统提供的ContentPrivider
 * 今天以获取联系人为例
 * 系统在写联系人这个app的时候,就已经提供好了一个联系人的ContentPrivider
 * 看一下系统提供的联系人数据库
 * 源码里面都有。我们看一下截图
 * raw_contacts表
 * contact_id存放联系人的id
 *
 * data表这个表示用来存储所有联系人的详细信息。
 * 一个联系人的信息可能分为多条数据,
 * 其中比较重要的字段是数据类型,联系人id,还有数据内容
 * 其中有一个字段mime_type是数据的类型(电话、邮箱、名字等)
 * mime_type表
 * 联系人所有的数据类型选项
 *
 * 看源码可以看出contentPrivider有两个Uri,两个都是可以用的
 * 但是在4.0之后只能使用分号后面的Uri,该路径是向低版本兼容的
 *
 * 如果要获取联系人的数据,该怎么做?
 * 1.获取所有的联系人的id
 * 2.根据id查询到这个联系人的所有的数据消息
 *
 */
public class MainActivity extends AppCompatActivity {

    private Button mGetContacts;
    private Button mUpdataContacts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGetContacts = (Button) findViewById(R.id.getContacts);
        mUpdataContacts = (Button) findViewById(R.id.updataContacts);
        mGetContacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                这里进行联系人的获取
                ContentResolver cr = getContentResolver();
//                1.获取所有的联系人id
                Cursor cursorID = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[]{"contact_id"},null,null,null);
                if (cursorID.getCount()==0){
                    Toast.makeText(MainActivity.this,"没有联系人",Toast.LENGTH_SHORT).show();
                    return;
                }
//                2.根据id,获取到每一个联系人的所有信息
                while(cursorID.moveToNext()){
//                    拿到id的字符串
                    String contactid = cursorID.getString(cursorID.getColumnIndex("contact_id"));
//                    根据id去data数据库里查询联系人的所有信息
                    Cursor contactData = cr.query(Uri.parse("content://com.android.contacts/data"),new String[]{"data1","mimetype"},"raw_contact_id = ?",new String[]{contactid},null);
//                    遍历获取联系人信息
                    while(contactData.moveToNext()){
                        String data1 = contactData.getString(contactData.getColumnIndex("data1"));
//                        拿到数据的类型
                        String mimeType = contactData.getString(contactData.getColumnIndex("mimeType"));
                        if ("vnd.android.cursor.item/email_v2".equals(mimeType)){
                            Log.i("邮箱",data1);

                        }else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)){
                            Log.i("手机:",data1);

                        }else if ("vnd.android.cursor.item/name".equals(mimeType)){
                            Log.i("名字",data1);
                        }
                    }
//                            关闭游标对象释放内存
                    contactData.close();
                }
//                关闭游标对象释放内存
                cursorID.close();
//                3.添加权限,允许读取ContentPrivider
            }
        });

//        通过上面分析,我们想要插入联系人,就需要如下的操作:
//        1、先去 raw_contacts 表中添加 id;
//        2、然后借助 id 去 data 表中添加各种信息。
        mUpdataContacts.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ContentResolver cr2 = getContentResolver();
//先查询 raw_contacts 表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的 id
                Cursor cursorId = cr2.query(Uri.parse("content://com.android.contacts/raw_contacts"),
                        new String[]{"_id"},null,null,null);
//默认联系人 id 就是 1
                int contact_id = 1;
                if(cursorId.moveToLast()){
                    //拿到主键
                    int _id = cursorId.getInt(cursorId.getColumnIndex("_id")); //主键+1,就是要插入的联系人
                    contact_id = ++_id;
                }
//把 contact_id 添加到 raw_contacts 表中
                ContentValues values = new ContentValues();
                values.put("contact_id",contact_id);
                cr2.insert(Uri.parse("content://com.android.contacts/raw_contacts"),values);
//清空 ContentValues 插入姓名
                values.clear();
                values.put("data1", "藤原拓海");
                values.put("mimetype", "vnd.android.cursor.item/name");
                values.put("raw_contact_id", contact_id);
                cr2.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入电话
                values.clear();
                values.put("data1", "110119120");
                values.put("mimetype", "vnd.android.cursor.item/phone_v2");
                values.put("raw_contact_id", contact_id); cr2.insert(Uri.parse("content://com.android.contacts/data"), values);
                cursorId.close();
                Toast.makeText(getApplicationContext(),"插入数据成功",Toast.LENGTH_SHORT).show();
            }
        });

    }
}
这里注意需要添加读写权限
  <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
时间: 2024-08-28 22:54:12

以获取和添加联系人为例学习调用系统ContentPrivider的相关文章

Android学习笔记之,调用系统图库,添加自定义字体,屏幕截图

新年开始的第一天就来学习了慕课迎春活动中的Android心愿分享一课,学到了几个知识点,在此记录一下. 1.调用系统图库调用系统图库用的是intent,步骤为弹出系统图库选择器,选择图片后获取到所选择的图片.代码如下: //在需要的地方调用 Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/

Android 实例讲解添加本地图片和调用系统拍照图片

在项目的开发过程我们离不开图片,而有时候需要调用本地的图片,有时候需要调用拍照图片.同时实现拍照的方法有两种,一种是调用系统拍照功能,另一种是自定义拍照功能.而本博文目前只讲解第一种方法,第二种方法后期在加以讲解. 添加本地图片和调用系统拍照图片主要是通过调用acitivity跳转startActivityForResult(Intent intent, int requestCode)方法和activity返回结果onActivityResult(int requestCode, int re

当我使用一个单例,调用一个类型对象的时候,程序出现了崩溃

具体报错如下,希望可以得到解决: 2014-06-28 08:57:46.508 XYZ[707:1403] *** Assertion failure in -[UIKeyboardTaskQueue waitUntilAllTasksAreFinished], /SourceCache/UIKit_Sim/UIKit-2935.137/Keyboard/UIKeyboardTaskQueue.m:368 2014-06-28 08:57:46.509 XYZ[707:1403] *** Te

IOS中调用系统的电话、短信、邮件、浏览功能

iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评论, 收藏, 编辑 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务目 录 短信与邮件 通讯录

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

调用系统的打电话,发短信,邮件,蓝牙

在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的系统应用.常用的协议如下: 打电话:tel:或者tel://.telprompt:或telprompt://(拨打电话前有提示) 发短信:sms:或者sms:// 发送邮件:mailto:或者mailto:// 启动浏览器:http:或者http:// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

PB调用系统自带的DLL 实现MD5

适用环境:powerbuilder 10.0以后的版本  window server2003以后的测试可用 PB也可以调用系统自带的DLL 实现MD5 其中md5file对大附件的处理速度也比第三方组件快一些 这里可以去下载附件 //调用样例: u_derek_md5 lu_md5 lu_md5=create u_derek_md5 string ls_text="123" string ls_result,ls_ret string ls_filepath="C:\1.tx

Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题

版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是“确定”图标,返回的resultCode = -1(Activity.RESULT_OK): 如果点击的是底部的“返回”键,返回的resultCode = 0(Activity.RESULT_CANCELED). 简单的调用系统相机的写法: //调用系统拍照 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String p

iOS开发--调用系统通讯录界面

今天写代码遇到了要调用系统通讯录,看了一些博客发现写的都是获取通讯录的内容,而不是调用系统的界面. 分享一下自己写的代码 第一步:引入 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 第二步:添加点击事件 创建一个通讯录界面 并以present的方式跳转 #pragma mark -- IBAction - (IBAction)buttonClicked:(id)sender {