`
jiguansheng
  • 浏览: 128089 次
  • 性别: Icon_minigender_1
  • 来自: 九江
社区版块
存档分类
最新评论

通讯录操作示例

 
阅读更多

package wjh.android.contact;

import java.util.ArrayList;

import android.content.ContentProviderOperation;

import android.content.ContentProviderResult;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.provider.ContactsContract;

import android.provider.ContactsContract.RawContacts;

import android.provider.ContactsContract.CommonDataKinds.Email;

import android.provider.ContactsContract.CommonDataKinds.Phone;

import android.provider.ContactsContract.CommonDataKinds.StructuredName;

import android.provider.ContactsContract.Contacts.Data;

import android.test.AndroidTestCase;

import android.util.Log;

/**

 * 通讯录操作示例

 *

 */

public class ContactTest extends AndroidTestCase {

private static final String TAG = "ContactTest";

/**

* 获取通讯录中所有的联系人

*/

public void testGetContacts() throws Throwable {

ContentResolver contentResolver = this.getContext().getContentResolver();

String uriStr = "content://com.android.contacts/contacts";

Uri uri = Uri.parse(uriStr);

Cursor cursor = contentResolver.query(uri, null, null, null, null);

// 遍历联系人

while (cursor.moveToNext()) {

// 联系人 ID

int contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));

// 联系人显示名称

String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

// 联系人电话号码需要对另一个表进行查询,所以用到另一个 uri:content://com.android.contacts/data/phones 

Cursor phones = getContext().getContentResolver().query(

                       ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

                       null,

                       ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "   // 根据上一步获取的联系人 id 来查询

                                        + contactId, null, null);   

String phone = "";

while (phones.moveToNext()) {

                                // "data1"字段,所以此处也可以直接写 "data1",但不推荐

phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

}

// 再查询 Email。uri 为 : content://com.android.contacts/data/emails 

Cursor emails = getContext().getContentResolver().query(

                      ContactsContract.CommonDataKinds.Email.CONTENT_URI,

                      null,

                      ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = "

                                       + contactId, null, null);

while (emails.moveToNext()) {

                                /* 一样是 "data1" 字段。现在明白了吧?一个联系人的信息,其实被分成了好几条记录来保存,data1分别保存了各种重要的信息。

                                 * 是时候参照打开数据库我前面所说,去瞄一眼它的表结构了!

                                 */

String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

Log.i("RongActivity", "emailAddress=" + emailAddress);

}

emails.close();

Log.i(TAG, "Contact [contactId= "+ contactId +"name=" + name + ", phone=" + phone + "]");

}

}

/**

* 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId 

* 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见

*/

public void testInsert() {

ContentValues values = new ContentValues();

//首先向RawContacts.CONTENT_URI执行一个空值插入(raw_contacts 表), 为了获取生成的联系人 ID

Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values);

//然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID

long rawContactId = ContentUris.parseId(rawContactUri);

/* Andorid 中,将联系人的姓名、电话、Email 

 * 分别存放在 data 表的同一个字段的三条记录当中

 * 因此要  Insert 三次 */

//往data表入姓名数据

values.clear();

// raw_contacts_id 字段,是 raw_contacts表id 的外键,用于说明此记录属于哪一个联系人

values.put(Data.RAW_CONTACT_ID, rawContactId); 

// mimitype_id 字段,用于描述此数据的类型,电话号码?Email?....

values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);   // 注意查看第二个参数的常量值

values.put(StructuredName.GIVEN_NAME, "文白菜");   // 这个名字真好听

this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);

//往data表入电话数据

values.clear();

values.put(Data.RAW_CONTACT_ID, rawContactId);

values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 

values.put(Phone.NUMBER, "15101689230");

values.put(Phone.TYPE, Phone.TYPE_MOBILE);

this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);

//往data表入Email数据

values.clear();

values.put(Data.RAW_CONTACT_ID, rawContactId);

values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);

values.put(Email.DATA, "wenlin56@sina.com");

values.put(Email.TYPE, Email.TYPE_WORK);

this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);

}

/**

* 在同一个事务当中保存联系人

*/

public void testSave() throws Throwable{

//文档位置:reference/android/provider/ContactsContract.RawContacts.html

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

int rawContactInsertIndex = ops.size();

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, "文萝卜")

                         .build());

// 更新手机号码:Data.RAW_CONTACT_ID 获取上一条语句插入联系人时产生的 ID

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, "15101689231")  // "data1"

                                         .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, "wenlin56@yahoo.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());

}

}

}


分享到:
评论

相关推荐

    android2.2通讯录操作源代码

    本文将详细介绍一个基于Android 2.2版本的通讯录操作示例源代码。该代码实现了读取、添加、删除以及更新联系人的功能。对于学习Android平台上的通讯录操作来说,这是一个很好的实践案例。 #### 二、关键类与接口 1...

    android 简易通讯录(sqlite示例)

    在Android平台上,构建一个简易通讯录是一个常见的应用场景,它涉及到数据存储、用户界面以及数据管理等方面。本项目采用SQLite作为数据库管理系统,SQLite是一款轻量级的、嵌入式的、关系型数据库,尤其适合于移动...

    通讯录 示例

    "通讯录 示例"这个项目,根据其标题和描述,似乎是一个演示性的应用或代码库,旨在展示如何实现通讯录的基本功能,包括备份数据、还原数据、更新联系人信息以及查找联系人等。以下是对这些功能的详细解释: 1. **...

    基于vc++的MFC个人通讯录示例

    总之,“基于vc++的MFC个人通讯录示例”是一个涵盖了MFC基础、数据库操作、用户交互等多方面技能的综合实践项目。通过学习这个示例,开发者可以深入理解MFC的机制,并具备开发类似桌面应用的能力。在实际开发过程中...

    C++语言编写的通讯录源程序示例

    在本示例中,我们探讨的是一个使用C++语言编写的通讯录应用程序,该程序是在Visual Studio C++环境中开发的。C++是一种强大的、面向对象的编程语言,它结合了低级内存管理的能力与高级抽象概念,使得开发者可以创建...

    数据库操作(通讯录)

    本实例“数据库操作(通讯录)”为我们提供了一个具体的应用场景,即如何利用数据库技术管理个人或组织的通讯录信息。通讯录是一个常见的应用,它涉及到对人名、电话号码、电子邮件地址等个人信息的存储、检索和管理...

    个人通讯录管理系统课程设计报告报告示例.doc

    首先,个人通讯录管理系统旨在为用户提供一个界面友好、操作简单的通讯录信息管理平台。用户可以便捷地添加新联系人、查找特定联系人、修改现有联系人信息、删除不再需要的联系人记录,以及查看全部联系人列表。这些...

    iPhone通讯录联系人操作大全

    首先,关于“源码”,这可能意味着博主分享了与iPhone通讯录操作相关的代码示例或自定义解决方案。在iOS开发中,我们通常会用到苹果提供的Contacts框架(Contacts.framework)来访问和管理用户的联系人。开发者可以...

    简单的通讯录代码

    【简单的通讯录代码】是一个基于Java技术实现的通讯录应用示例,主要涉及了Java编程基础和数据库操作,特别是使用了Java Database Connectivity (JDBC) API来与数据库进行交互。这个通讯录系统能够帮助用户存储、...

    swift-ZHContactManager-通讯录操作选择联系人添加新联系人添加到现有联系人;

    `ZHContactManager` 是一个专为Swift开发者设计的库,它简化了与iOS系统通讯录(Contacts框架)的交互,使得进行如选择联系人、创建新联系人以及将联系人添加到现有联系人等操作变得更为便捷。在这个项目中,我们...

    制作通讯录 制作通讯录

    #### 三、代码示例解析 以下是对部分代码片段的分析: ```c void Add(void) { p1 = (struct contactor *)malloc(LEN); ``` 此段代码用于分配内存空间以存储新的联系人信息。`LEN` 是预先定义好的结构体大小。这里...

    android通讯录开发源码

    8. **异步操作**:为了保证UI的流畅性,通常在后台线程(如AsyncTask)中执行耗时的通讯录操作。 9. **UI设计**:使用RecyclerView展示联系人列表,可实现高效的滚动和复用视图。每个联系人条目可能包括姓名、电话...

    多用户远程访问Access数据库--通讯录示例(VB+ASP+ACCE)

    本示例"多用户远程访问Access数据库--通讯录示例(VB+ASP+ACCE)"展示了一个多用户可以同时操作的远程数据库系统,这突破了Access数据库通常只在局域网内使用的局限。以下将详细解释这个系统的组成部分和相关技术知识...

    安卓ContentResolver操作通讯录demo

    本项目"安卓ContentResolver操作通讯录demo"是一个实战示例,展示了如何通过ContentResolver对安卓设备的通讯录进行增删改查的基本操作,并包含一个简单的欢迎界面。 首先,了解ContentResolver的基本使用。在...

    根据c++编写通讯录论文

    在这个通讯录系统中,`student`结构体代表通讯录中的一个联系人,而`inter`类则是一个派生类,它包含了一系列与通讯录操作相关的成员函数。 2. **结构体(Struct)**:`struct student`定义了一个结构体,其中包含...

    iOS通讯录访问操作封装,全部封装为objective-c对象,不用再使用底层的C语言操作通讯录了.zip

    3. 示例代码:可能包含了一些示例代码,演示如何使用这个封装库来操作通讯录,这对于开发者快速上手非常有帮助。 在实际使用中,开发者可以这样操作通讯录: ```objc #import "SLAddressBook.h" SLAddressBook *...

    基于vfp 通讯录系统

    【基于VFP的通讯录系统】是一个利用Visual FoxPro(VFP)开发的管理软件,主要功能是管理和...它通过直观的用户界面和完善的数据库操作,为用户提供了方便的信息存储和检索方式,是VFP技术在实际应用中的一个典型示例。

    xml的基本操作实例(通讯录)

    在本实例中,我们将深入探讨如何使用XML进行基本操作,特别是在构建一个简单的通讯录应用中的应用。这个通讯录示例可能没有华丽的界面,但它为初学者提供了关于XML实际应用的宝贵经验。 1. **XML结构基础**: XML...

    VB简易的通讯录,学习数据写入操作

    【VB简易通讯录:数据写入操作详解】 在信息技术领域,Visual Basic(VB)是一种流行的编程语言,尤其适合初学者入门。本项目“VB简易的通讯录”旨在帮助学习者理解如何利用VB进行数据写入操作,从而创建一个简单的...

Global site tag (gtag.js) - Google Analytics