文档章节

Android自学之路-- 03:访问通讯录,并向通讯录中添加联系人

 妞妞超人
发布于 2014/05/09 14:38
字数 699
阅读 47
收藏 0
点赞 0
评论 0

有时应用开发需要访问通讯录,对手机通讯录进行读写操作。这时就需要用到ContentProvider。

我们通过一个小的案例来学习如何实现此功能。

package cn.meng.test;

import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;

public class ContactsTest extends AndroidTestCase{
    private static final String TAG = "ContactsTest";
    
    //获取所有联系人
    public void testContacts(){
        Uri uri = Uri.parse("content://com.android.contacts/contacts");
        //获得ContentResolver
        ContentResolver resolver = this.getContext().getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
        while(cursor.moveToNext()){
            int contactsId = cursor.getInt(0);
            //访问某个联系人下的所有数据
            uri = Uri.parse("content://com.android.contacts/contacts/" + contactsId + "/data");
            StringBuilder sb = new StringBuilder("contactsId="+contactsId);
            Cursor datacursor = resolver.query(uri, new String[]{"mimetype","data1","data2"}, null, null, null);
            while(datacursor.moveToNext()){
                String data = datacursor.getString(datacursor.getColumnIndex("data1"));
                String type = datacursor.getString(datacursor.getColumnIndex("mimetype"));
                if("vnd.android.cursor.item/name".equals(type)){
                    //姓名
                    sb.append(",name="+data);
                }else if("vnd.android.cursor.item/email_v2".equals(type)){
                    //邮件
                    sb.append(",email="+data);
                }else if("vnd.android.cursor.item/phone_v2".equals(type)){
                    //电话
                    sb.append(",phone="+data);
                }
            }
            Log.i(TAG, sb.toString());
            
        }
    }
    
    //根据号码查找联系人的姓名
    public void testContactNameByPhone(){
        String phoneNum = "5633288";
        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phoneNum);
        //获得ContentResolver
        ContentResolver resolver = this.getContext().getContentResolver();
        Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null);
        while(cursor.moveToNext()){
            String name = cursor.getString(0);
            Log.i(TAG, name);
            
        }
        cursor.close();
    }
    
    //向通讯录中添加联系人,此步骤是分开的,如果有部分错误,错误的添加不进去,不影响其他,有弊端
    public void testAddContact()throws Exception{
        //向raw_contacts表中添加数据
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        //获得ContentResolver
        ContentResolver resolver = this.getContext().getContentResolver();
        long contactsId = ContentUris.parseId(resolver.insert(uri, new ContentValues()));
        
        //向data表中添加数据
        uri = Uri.parse("content://com.android.contacts/data");
        ContentValues values = new ContentValues();
        values.put("raw_contact_id", contactsId);
        values.put("mimetype", "vnd.android.cursor.item/name");//姓名
        values.put("data2", "大大");
        resolver.insert(uri,values);
        
        values.clear();
        values.put("raw_contact_id", contactsId);
        values.put("mimetype", "vnd.android.cursor.item/phone_v2");//电话
        values.put("data1", "13831056895");
        values.put("data2", "2");
        resolver.insert(uri,values);
        
        values.clear();
        values.put("raw_contact_id", contactsId);
        values.put("mimetype", "vnd.android.cursor.item/email_v2");//邮箱
        values.put("data1", "138@qq.com");
        values.put("data2", "1");
        resolver.insert(uri,values);
        
    }
    
    //向通讯录中添加联系人,整体作为一个步骤,有部分出错,就添加不进去联系人信息
    public void testAddContact2()throws Exception{
        //向raw_contacts表中添加数据
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        //获得ContentResolver
        ContentResolver resolver = this.getContext().getContentResolver();
        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
        
        ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
            .withValue("account_name", null).build();
        
        operations.add(op1);
        
        //向data表中添加数据
        uri = Uri.parse("content://com.android.contacts/data");
        //0指的是operations集合下标为0的第一个元素,获得Id
        ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/name")
            .withValue("data2", "小小")
            .build();
        operations.add(op2);
        
        ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
            .withValue("data1", "13523568963")
            .withValue("data2", "2")
            .build();
        operations.add(op3);
    
        ContentProviderOperation op4 = ContentProviderOperation.newInsert(uri)
            .withValueBackReference("raw_contact_id", 0)
            .withValue("mimetype", "vnd.android.cursor.item/email_v2")
            .withValue("data1", "45623789@126.com")
            .withValue("data2", "1")
            .build();
        operations.add(op4);
        
        resolver.applyBatch("com.android.contacts", operations);
        
    }
}

项目清单配置如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.meng.contacts"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />
    <!-- 申请读写权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".MainActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
         <!-- 单元测试 -->
        <uses-library android:name="android.test.runner"/>
    </application>

     <!-- 单元测试 -->
    <instrumentation 
            android:name="android.test.InstrumentationTestRunner"
            android:targetPackage="cn.meng.contacts"></instrumentation>

</manifest>


© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 6
码字总数 4076
作品 0
邯郸
程序员
使用Content Provider得到联系人信息

ContentProvider简介 我们说Android应用程序的四个核心组件是:Activity、Service、BroadcastReceiver和ContentProvider。在Android中,应用程序彼此之间相互独立的,它们都运行在自己独立的...

晨曦之光
2012/03/13
0
0
google账户、安卓手机联系人同步的使用方法

google账户、安卓手机联系人同步的使用方法 一、前言:新入安卓三星手机一部。 我原来一直用google账户保存联系人,使用起来非常方便,大量的联系人编辑、分组,信息整理非常方便。 手机拿到...

雕栏玉砌
2012/10/18
0
1
【OSChina-MoPaaS应用开发大赛】kLink通讯录

应用名称:kLink通讯录 应用URL地址:http://klink.sturgeon.mopaas.com/ 应用说明及使用场景: kLink是一个简单、直接、纯粹的通讯录应用,支持PC浏览器、android、ios、windows phone等平台...

恺哥
2013/12/18
0
43
Android 的 Intents 和 Intent Filters(实例部分)

引言 上篇我们介绍了Intents和Intent Filters的理论部分,主要是介绍了:activities、services、broadcastreceivers三种组件的Intent机制两种Intent(显式和隐式)及它们如何去匹配目的组件、...

鉴客
2011/09/28
886
0
Android通讯录查询篇--ContactsContract.Data开篇

正在学习Android,想先找个简单点的东西练习一下,先想到的是通讯录,不过关于手机通讯录方面的资料在我现有的书和视频上都很少看到。没办法只有自己看SDK Docs了。 不管怎么说还是先赞Googl...

黑菜妞妞
2011/07/25
0
0
windows mobile (wm)手机 或 Symbian手机 联系人导入 android

先安装手机驱动,然后安装 智能手机工作室S60在线版 或 智能手机工作室WM , 下载地址: http://www.zhuae.com/club/download.jsp 装完后用智能手机工作室导出联系人,格式为xml格式. 比如 a.xm...

sevk
2011/07/12
0
0
Android手机通讯录项目开发--联系人数据库contacts2.db介绍

项目描述:该项目为基于Android平台的手机通讯录,主要模块分为四个部分:联系人管理模块,通话记录管理模块,短信管理模块,系统设置模块。 系统结构图如下: 本项目启动时间:2014年5月28日...

2tman
2015/08/13
0
0
Android QuickContactBadge联系人快捷标识

public classQuickContactBadgeextends ImageViewimplements View.OnClickListenerjava.lang.Object↳ android.view.View↳ android.widget.ImageView↳ android.widget.QuickContactBadge a......

amigos_wu
2012/05/27
0
0
Android通讯录数据库操作(转)

可以参考 这个博客http://www.uml.org.cn/mobiledev/201110121.asp 对contact2.db中的几个比较常用的表进行总结: 包括 contacts表,rawcontacts表,data表,phonelookup表 希望大家参照源代...

xiahuawuyu
2012/09/29
0
0
Android系统中标准Intent的使用

一 Android系统用于Activity的标准Intent 1 根据联系人ID显示联系人信息 Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW); //显示联系人信息intent.setData(Uri.parse(......

厚德
2015/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring+jpaNo transactional EntityManager available

TransactionRequiredException: No transactional EntityManager availableEntityManager执行以下方法(refresh, persist, flush, joinTransaction, remove, merge) 都需要需要事务i......

wpfc
9分钟前
0
0
八幅漫画理解使用JSON Web Token设计单点登录系统

八幅漫画理解使用JSON Web Token设计单点登录系统 Sep 07, 2015 in Engineering 上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。...

祖冲之
11分钟前
0
0
Spring框架中的设计模式(三)

Spring框架中的设计模式(三) 原创: 瑞查德-Jack 在之前的两篇文章中,我们看到了一些在Spring框架中实现的设计模式。这一次我们会发现这个流行框架使用的3种新模式。 本文将从描述两个创意...

瑞查德-Jack
14分钟前
1
0
[MicroPython]TPYBoard智能小车“飞奔的TPYBoard装甲一号”

智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具...

bodasisiter
16分钟前
0
0
桌面虚拟化VDI(Virtual Desktop Infrastructure)

为了保证员工(客户)不把公司的资料复制、传输给别人。可以把员工平时办公放在服务器上做。所以使用桌面虚拟化。就是把一个服务器虚拟出很多桌面系统(如:windows)。 桌面虚拟化最大的优势...

王坤charlie
24分钟前
3
0
自我审视及职业规划

啊哈,不知不觉已经工作了3年了。程序员作为一门技术工作,如果分级的话我的能力如何呢?该怎么提升呢? 话说,我现在的能力属于中低级的层次吧,努力在向高级努力。为什么这么说呢: 因为我觉...

一口今心
26分钟前
3
0
《PHP和MySQL Web 开发》 第12章 MySQL高级管理

我决定好好写学习笔记了,对应上书上的目录和重要信息。不瞎jb写了。从这章开始吧,然后之前写的会编辑后重发。嗯,就酱。 12.1 深入理解权限系统 妈蛋 开头就卡住了。。。我先回去修改之前的...

十万猛虎下画山
27分钟前
1
0
Python 3.6:多态的实现

多态的作用不用多说,C++用如下条件来实现多态: 要有继承 要有虚函数函数重写 要有父类指针(父类引用)指向子类对象 实际上C++使用VPTR指针来完成这个事情,其是设计模式的基础,软件分层的基...

全部原谅
27分钟前
0
0
纯Python实现鸢尾属植物数据集神经网络模型[图]

纯Python实现鸢尾属植物数据集神经网络模型[图]: 尝试使用过各大公司推出的植物识别APP吗?比如微软识花、花伴侣等这些APP。当你看到一朵不知道学名的花时,只需要打开植物识别APP,拍摄一张...

原创小博客
29分钟前
2
0
2018安卓巴士开发者大会打造Android技术盛宴

2018安卓巴士开发者大会打造Android技术盛宴2018安卓巴士开发者大会将于8月25日在上海举行,作为中国最具前沿性、专业性的安卓技术会议,将邀请来自爱奇艺、阿里、饿了么等知名企业的一线工程...

逆鳞龙
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部