Android系统中的联系人也是通过ContentProvider来对外提供数据的,我们这里实现获取所有联系人、通过电话号码获取联系人、添加联系人、使用事务添加联系人。
获取所有联系人的权限:
<uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/>
获取所有联系人
1. Android系统中的联系人也是通过ContentProvider来对外提供数据的
2. 数据库路径为:/data/data/com.android.providers.contacts/database/contacts2.db
3. 我们需要关注的有3张表
raw_contacts:其中保存了联系人id
data:和raw_contacts是多对一的关系,保存了联系人的各项数据
mimetypes:为数据类型
4. Provider的authorites为com.android.contacts
5. 查询raw_contacts表的路径为:contacts
6. 查询data表的路径为:contacts/#/data
这个路径为连接查询,要查询“mimetype”字段可以根据“mimetype_id”查询到mimetypes表中的数据
7. 先查询raw_contacts得到每个联系人的id,在使用id从data表中查询对应数据,根据mimetype分类数据
示例:
//查询所有联系人 public void testGetAll() { ContentResolver resolver = getContext().getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/contacts"); Cursor idCursor = resolver.query(uri, new String[] { "_id" }, null, null, null); while (idCursor.moveToNext()) { //获取到raw_contacts表中的id int id = idCursor.getInt(0); //根据获取到的ID查询data表中的数据 uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data"); Cursor dataCursor = resolver.query(uri, new String[] { "data1", "mimetype" }, null, null, null); StringBuilder sb = new StringBuilder(); sb.append("id=" + id); //查询联系人表中的 while (dataCursor.moveToNext()) { String data = dataCursor.getString(0); String type = dataCursor.getString(1); if ("vnd.android.cursor.item/name".equals(type)) sb.append(", name=" + data); else if ("vnd.android.cursor.item/phone_v2".equals(type)) sb.append(", phone=" + data); else if ("vnd.android.cursor.item/email_v2".equals(type)) sb.append(", email=" + data); } System.out.println(sb); } }
通过电话号码获取联系人
1. 系统内部提供了根据电话号码获取data表数据的功能,路径为:data/phones/filter/*
2. 用电话号码替换“*”部分就可以查到所需数据,获取“display_name”可以获取到联系人显示名
示例:
//根据电话号码查询联系人名称 public void testGetName() { ContentResolver resolver = getContext().getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/1111"); Cursor c = resolver.query(uri, new String[] { "display_name" }, null, null, null); while (c.moveToNext()) { System.out.println(c.getString(0)); } }
添加联系人
1. 先向raw_contacts表插入id,路径为:raw_contacts
2. 得到id之后再向data表插入数据,路径为:data
示例:
//添加联系人 public void testInsert() { ContentResolver resolver = getContext().getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentValues values = new ContentValues(); // 向raw_contacts插入一条除了ID之外, 其他全部为NULL的记录, ID是自动生成的 long id = ContentUris.parseId(resolver.insert(uri, values)); //添加联系人姓名 uri = Uri.parse("content://com.android.contacts/data"); values.put("raw_contact_id", id); values.put("data2", "FHM"); values.put("mimetype", "vnd.android.cursor.item/name"); resolver.insert(uri, values); //添加联系人电话 values.clear(); // 清空上次的数据 values.put("raw_contact_id", id); values.put("data1", "18600000000"); values.put("data2", "2"); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); resolver.insert(uri, values); //添加联系人邮箱 values.clear(); values.put("raw_contact_id", id); values.put("data1", "zxx@itcast.cn"); values.put("data2", "1"); values.put("mimetype", "vnd.android.cursor.item/email_v2"); resolver.insert(uri, values); }
使用事务添加联系人
1. 在添加联系人得时候是分多次访问Provider,如果在过程中出现异常,会出现数据不完整的情况,这些操作应该放在一次事务中
2. 使用ContentResolver的applyBatch(String authority,ArrayList<ContentProviderOperation> operations) 方法可以将多个操作在一个事务中执行
3. 文档位置:
file:///F:/android-sdk-windows/docs/reference/android/provider/ContactsContract.RawContacts.html
示例:
//使用事务添加联系人 public void testInsertBatch() throws Exception { ContentResolver resolver = getContext().getContentResolver(); ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); ContentProviderOperation operation1 = ContentProviderOperation // .newInsert(Uri.parse("content://com.android.contacts/raw_contacts")) // .withValue("_id", null) // .build(); operations.add(operation1); ContentProviderOperation operation2 = ContentProviderOperation // .newInsert(Uri.parse("content://com.android.contacts/data")) // .withValueBackReference("raw_contact_id", 0) // .withValue("data2", "ZZH") // .withValue("mimetype", "vnd.android.cursor.item/name") // .build(); operations.add(operation2); ContentProviderOperation operation3 = ContentProviderOperation // .newInsert(Uri.parse("content://com.android.contacts/data")) // .withValueBackReference("raw_contact_id", 0) // .withValue("data1", "18612312312") // .withValue("data2", "2") // .withValue("mimetype", "vnd.android.cursor.item/phone_v2") // .build(); operations.add(operation3); ContentProviderOperation operation4 = ContentProviderOperation // .newInsert(Uri.parse("content://com.android.contacts/data")) // .withValueBackReference("raw_contact_id", 0) // .withValue("data1", "zq@itcast.cn") // .withValue("data2", "2") // .withValue("mimetype", "vnd.android.cursor.item/email_v2") // .build(); operations.add(operation4); // 在事务中对多个操作批量执行 resolver.applyBatch("com.android.contacts", operations); }
相关推荐
本教程将深入探讨如何通过编程方式在Android设备上添加联系人。 首先,我们需要了解Android系统的联系人存储机制。Android使用ContentProvider来管理系统的数据,包括联系人。`ContactsContract`类是Android提供的...
本节将深入探讨Android中的联系人群组(Group)操作,这些操作通常涉及到编程接口的使用,以便在应用程序中实现自定义的联系人管理功能。 首先,Android的联系人数据存储在ContentProvider中,它是Android系统提供...
总的来说,"android合并重复联系人功能"是Android开发中的一个重要领域,它涉及到数据处理、算法设计、数据库操作以及用户交互等多个方面,通过这一功能的实现,我们可以显著提升Android设备的联系人管理效率。
总之,Android软件开发中获取通讯录联系人信息是一个涉及权限管理、数据查询和用户隐私的重要环节。开发者需要熟悉`ContactsContract`和`ContentResolver`的使用,以及如何在Android 6.0以上版本处理运行时权限。...
在Android平台上,获取通讯录中的联系人信息是常见的功能需求,尤其当需要处理与电子邮件相关的应用时。这个DEMO展示了如何有效地读取那些在联系人信息中设置了电子邮件地址的联系人。下面我们将深入探讨实现这一...
在实际开发中,你可能还需要考虑更多的细节,例如处理空指针异常、优化查询性能、过滤重复联系人、根据需求筛选特定联系人(如只获取有电话号码的联系人)等。同时,为了提升用户体验,可以考虑使用异步任务或Loader...
在Android平台上,开发一款基于Android 2.2的联系人应用是学习Android开发的重要实践。...通过学习这个源码,开发者不仅可以掌握联系人操作,还能提升对Android系统和编程模式的理解,为更复杂的应用开发打下坚实基础。
以上就是关于Android调用系统通讯录、选择联系人、拨打电话、添加及查询联系人的详细步骤和关键代码。在实际开发中,还需要注意权限管理、UI设计以及错误处理等方面,确保应用的稳定性和用户体验。
总之,“Androidstudio电话联系人及详情页”项目涵盖了Android开发中的一些关键点,包括数据获取、UI设计、Activity间通信以及设计模式的应用。理解并掌握这些知识点对于Android开发者来说至关重要,因为它们构成了...
在Android系统中,管理设备上的联系人是一项常见的任务,其中包括添加、编辑以及删除联系人。在本Demo中,我们将深入探讨如何实现批量删除联系人的功能。这个Demo名为"Android+一个批量删除联系人的Demo",它提供了...
2. **查询功能**:通过搜索栏输入关键词,显示匹配的联系人列表,方便用户查找和选择联系人进行操作。 3. **通话功能**:从通讯录选择联系人后,可以直接拨打电话,同时展示与该联系人的通话记录。 4. **短信功能*...
在安卓(Android)平台上,开发人员经常需要与设备的通讯录进行交互,以便实现各种功能,如联系人管理、信息发送等。本实战应用主要涵盖了如何通过Android源码获取手机通讯录,包括SIM卡中的联系人信息。接下来,...
在实际开发中,你可能还需要处理更复杂的情况,如更新已存在的联系人、删除联系人、根据多个字段查询等。同时,需要注意的是,从Android 6.0(API级别23)开始,运行时权限管理需要在应用启动时动态请求权限,即使在...
这个标题"安卓获取联系人列表"指的是在Android系统中如何通过编程方式访问和读取用户的联系人数据。 在Android中,联系人数据存储在系统的Content Provider中,它是一个全局接口,允许应用程序之间共享数据。要获取...
当用户输入文本时,我们可以监听`SearchView`的`onQueryTextChange()`事件,然后实时更新`ListView`的内容,展示与查询文本匹配的联系人。这通常需要对原始数据进行过滤,并重新设置`Adapter`的数据。 手指滑动功能...
总结,这篇“android学习笔记3(联系人应用)”涵盖了Android中与联系人应用相关的多个方面,包括ContentProvider的工作原理、ContactsContract的使用、数据操作的方法、权限管理、以及源码分析等。对于想要深入理解...
要获取手机中的联系人,你需要创建一个ContentResolver实例,然后通过它的query()方法查询ContactsContract.Contacts表。例如: ```java ContentResolver resolver = getContentResolver(); Cursor cursor = ...
在Android平台上,对通讯录进行读取、插入、删除和更新是常见的操作,这对于开发涉及联系人管理的应用至关重要。本文将深入探讨这些知识点,并提供相关的编程实践指导。 ### 1. Android权限管理 在Android 6.0(API...