`
夏文权
  • 浏览: 243834 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

android联系人的开发

 
阅读更多
写道
Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来

contacts.db后 发面里面有一堆表,我们主要涉及到4张表,contacts 表 ,data表 ,phone_look_up表 ,raw_contact表 。

1.contacts 表

_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
times_contacted:通话记录的次数
last_time_contacted: 最后的通话时间
lookup :是一个持久化的储存 因为用户可能会改名子 但是它改不了lookup

Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来

contacts.db后 发面里面有一堆表,我们主要涉及到4张表,contacts 表 ,data表 ,phone_look_up表 ,raw_contact表 。

1.contacts 表

_id :表的ID,主要用于其它表通过contacts 表中的ID可以查到相应的数据。
display_name: 联系人名称
photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空
times_contacted:通话记录的次数
last_time_contacted: 最后的通话时间
lookup :是一个持久化的储存 因为用户可能会改名子 但是它改不了lookup


3.phone_look_up表

data_id : 通过data_id可以找到 datat表中相对的数据。
raw_contact_id : 通过raw_contact_id 可以找到 raw_contact_表中相对的数据。
normalized_number: 这个字段就比较有意思了,它是将每个电话号码逆序排列。

4.raw_contact表

version :版本号,用于监听变化
deleted :删除标志, 0为默认 1 表示这行数据已经删除
display_name : 联系人名称
last_time_contacts : 最后联系的时间 。

 

 

写道
content://com.android.contacts是联系人的路径,
content://com.android.contacts/contacts(所以联系人,要操作contacts这张表)
content://com.android.contacts/contacts/id 表示操作contact表中某一条id的记录
content://com.android.contacts/contacts/id/data 表示操作contact表中某一条id的记录中的data数据(data也是一张表)
 
写道
如果遇到这个错误:
Attempted to access a cursor
after it has been closed.

Application did not close the cursor or database
object that was opened here 。

原因是:

You should not be getting that message if you close the Cursor in onStop() or onDestroy().
Please try that again. Or, call startManagingCursor() after you get the Cursor from your query,
and Android will close the Cursor on its own.

也就说,你用了 startManagingCursor(c)或者
managedQuery(uri, null, null, null, null);

这个2个方法里面在操作数据库的时候,当获取完数据了,会自动关闭游标,那么你在不知道的情况下你再次关闭游标,所以造成崩溃。

解决方案:
采用getContentResolver;
比如:
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);

 

 

/**
	 * 查询所有的联系人
	 */
	private void testContact() {
		//com.android.contacts是联系人的路径,com.android.contacts/contacts(所以联系人)
		try {
			Uri uri = Uri.parse("content://com.android.contacts/contacts");//联系人uri
			
			ContentResolver resolver = getContentResolver();
			Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
			
			while(cursor.moveToNext()){
				//根据列索引
				int contactId = cursor.getInt(cursor.getColumnIndex("_id"));
				System.out.println("id === " + contactId);
				
				getContactByContactID(contactId);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}


/**
	 * 根据contact的id获取联系人的信息
	 * @param contactId
	 */
	private void getContactByContactID(int contactId) {
		ContentResolver phoneResolver = getContentResolver();
		Uri phoneUri = Uri.parse("content://com.android.contacts/contacts/"+contactId+"/data");//根据联系人的id来获取联系人的信息
		Cursor phoneCursor = phoneResolver.query(phoneUri, null, null, null, null);
		
		while(phoneCursor.moveToNext()){
			
			
			//data中的表,data1字段代表:姓+名,邮件,电话
			String data = phoneCursor.getString(phoneCursor.getColumnIndex("data1"));
//					System.out.println("data ====== " + data);
			
			//data2字段表示:名,邮件,电话的类型
//					String data2 = phoneCursor.getString(phoneCursor.getColumnIndex("data2"));
//					System.out.println("data2====== " + data2);
			
			String mimeId = phoneCursor.getString(phoneCursor.getColumnIndex("mimetype"));
//					System.out.println("mimeId====== " + mimeId);
			
			if(mimeId.equals("vnd.android.cursor.item/phone_v2")){//电话
				System.out.println("data ===phone=== " + data);//电话有多个
				
			}else if(mimeId.equals("vnd.android.cursor.item/email_v2")){//邮件
				System.out.println("data ===email=== " + data);
				
			}else if(mimeId.equals("vnd.android.cursor.item/name")){//名称
				System.out.println("data ===name=== " + data);
			}
		}
	}

	
  • 大小: 126.9 KB
  • 大小: 140.1 KB
  • 大小: 54.6 KB
  • 大小: 108.8 KB
分享到:
评论
1 楼 mysaber 2012-09-20  
我也遇到了这个问题,貌似说是Build.VERSION.SDK<14的不会主动关,大于等于14的会主动关

相关推荐

    android 联系人总结

    在Android系统中,联系人信息的存储与管理是通过内置的联系人数据库完成的...上述内容对于接触Android联系人开发的程序员来说,是必须要掌握的基础知识点,其能帮助开发者更好地管理和操作Android系统中的联系人数据。

    Android联系人经典案例

    综上所述,Android联系人开发涉及到的内容广泛,包括ContentProvider、ContentResolver、Cursor操作、权限管理、Intent交互、自定义界面等。通过深入理解这些概念和实践案例,开发者可以构建高效、用户体验良好的...

    android 联系人模块例子

    下面我们将深入探讨这个话题,了解Android联系人API的使用以及如何构建联系人管理模块。 首先,Android的联系人数据存储在系统数据库中,开发者可以通过Content Provider接口进行访问。Content Provider是Android...

    android 联系人排序,支持中文 demo

    总结,"android 联系人排序,支持中文 demo"涵盖了Android联系人API的使用、数据排序机制、中文字符处理、自定义排序规则以及性能优化等多个方面,是学习和解决Android中文联系人排序问题的重要参考。通过深入理解...

    Android开发之针对联系人的封装

    在Android应用开发中,针对联系人的封装是一项常用且重要的任务,尤其对于那些需要与用户通讯录集成的应用。本文主要探讨了如何在Android中创建一个独立的联系人模块,以简化获取和处理联系人的过程,同时提供了封装...

    android添加联系人

    在Android平台上,添加联系人是一项常见的任务,尤其对于开发者来说,理解如何操作联系人数据库是必要的。本教程将深入探讨如何通过编程方式在Android设备上添加联系人。 首先,我们需要了解Android系统的联系人...

    android应用程序开发

    在Android Studio的模拟器中进行测试,确保所有功能都能正常运行,如添加新的联系人,查看列表,以及成功拨打电话和发送短信。 4.3 手机运行结果 将应用部署到真实设备上进行测试,验证在不同Android版本和设备上的...

    android 联系人模块

    在Android平台上,联系人模块是应用开发中的一个重要组成部分,它允许用户管理他们的个人联系信息,如姓名、电话号码、电子邮件地址等。对于初学者来说,理解并实现这一功能可以帮助他们更好地掌握Android应用开发的...

    android平台联系人管理应用源码+项目(项目直接导入可运行)

    本项目“android平台联系人管理应用源码+项目”提供了一个可以直接运行的实例,对于学习和理解Android联系人管理的实现机制非常有帮助。以下是基于这个项目的一些关键知识点和详细说明: 1. **Android开发环境**:...

    Android-Android联系人选择器

    在Android应用开发中,"Android-Android联系人选择器"是一个常见的需求,它允许用户从他们的设备联系人列表中选择一个或多个联系人。这个功能广泛应用于消息发送、邀请发送等场景,提升用户体验并简化操作流程。在这...

    Android应用程序开发

    - **运行时权限**:针对敏感操作(如读取联系人、访问位置信息等),应用需要在运行时向用户请求权限。 - **安全机制**:如签名机制、沙盒模型等,确保应用之间的隔离和数据的安全。 #### 十、Android调试与发布 ...

    Android 联系人列表

    在Android开发中,构建一个联系人列表是常见的需求,它涉及到UI设计、数据获取和处理等多个方面。本篇文章将深入探讨如何实现一个“Android电话联系人页面布局”以及相关的代码实现。 首先,我们需要理解Android的...

    android读取系统联系人

    在Android平台上,开发人员可以利用系统的API来读取用户的联系人数据。这通常涉及到权限管理、ContentResolver的使用以及Cursor的遍历等关键知识点。以下是对这个"android读取系统联系人"主题的详细讲解: 1. **...

    基于Android Studio开发的安卓的通讯录管理app

    【基于Android Studio开发的安卓通讯录管理App】是一款利用谷歌提供的Android Studio集成开发环境构建的应用程序,它专注于管理和操作用户的联系人数据。该应用涵盖了多种关键功能,包括新增联系人、编辑现有联系人...

    android联系人查看器(源码)

    通过这个"android联系人查看器(源码)"项目,你可以深入理解Android应用的架构,学习如何与系统服务交互,以及如何高效地处理数据和构建用户友好的界面。这是一个很好的学习和实践平台,对于提升Android开发技能...

    Android联系人管理

    【Android联系人管理】是Android应用开发中的一个重要领域,它涉及到如何在Android设备上存储、检索、修改和删除联系人的信息。在这个项目中,你可能会遇到以下关键知识点: 1. **Android SDK**: 开发Android应用的...

    android 联系人 SIM卡 最近联系人 通讯录 获取源代码

    一、Android联系人管理 Android系统提供了ContentProvider接口来访问和操作联系人数据。主要涉及到以下几个核心类: 1. `ContactsContract`:这是Android系统提供的一个常量类,包含了所有关于联系人数据的URI、...

    android合并重复联系人功能

    为了解决这个问题,我们可以开发一个"android合并重复联系人功能",这将极大地提升用户体验,使得用户能够高效地管理和整合他们的通讯录。这个功能既可以作为一个独立的应用程序(apk)提供,也可以被集成到系统的...

    android 联系人广播协议 代码

    本文将深入探讨Android联系人广播协议的相关知识点,并通过代码示例来帮助开发者理解其工作原理。 一、Android联系人广播事件 当用户在系统中添加、删除或修改联系人时,Android会发送一个Intent广播,这个广播携带...

    Android获取联系人

    在Android系统中,获取联系人信息是常见的功能需求,尤其对于社交类或通讯类应用来说,这是一项必不可少的功能。为了实现这一目标,开发者需要理解Android的权限管理、ContentResolver和ContactsContract类。以下是...

Global site tag (gtag.js) - Google Analytics