Android个人手机通讯录开发详解

Android个人手机通讯录开发详解

概述

通讯录是手机操作系统中非常重要的一项功能,大多数APP,尤其是社交类APP都需要使用到该功能。本文将详细讲解如何在Android平台上开发个人手机通讯录,并提供两个示例。通讯录主要分为分组和联系人两个部分,下面将对这两部分进行详细介绍。

分组

分组主要用来对联系人进行分类,让用户能够更加方便地查找和编辑联系人信息。通讯录中的分组列表通常位于页面的左侧,点击分组列表的某一个分组,系统就会显示该分组中的联系人列表。

创建分组

要创建一个新的分组,我们可以通过以下步骤完成:

  1. 在布局文件中添加一个ListView控件,用来显示分组列表
<ListView
    android:id="@+id/groupListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  1. 在Activity中使用CursorLoader来加载分组数据,并使用SimpleCursorAdapter将数据绑定到ListView上
getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(
                MainActivity.this,
                ContactsContract.Groups.CONTENT_URI,
                new String[] {
                        ContactsContract.Groups._ID,
                        ContactsContract.Groups.TITLE
                },
                ContactsContract.Groups.DELETED + "!= ? AND " + ContactsContract.Groups.ACCOUNT_TYPE_AND_DATA_SET + "!= ?",
                new String[] { "0", null },
                ContactsContract.Groups.TITLE + " COLLATE LOCALIZED ASC");
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this,
                android.R.layout.simple_list_item_1,
                data,
                new String[] { ContactsContract.Groups.TITLE },
                new int[] { android.R.id.text1 });
        mGroupListView.setAdapter(adapter);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }
});
  1. 在Activity中处理ListView的点击事件,跳转到联系人列表页面,并将该分组的id作为参数传递给联系人列表页面
mGroupListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Cursor cursor = (Cursor) adapterView.getItemAtPosition(i);
        int groupId = cursor.getInt(cursor.getColumnIndexOrThrow(ContactsContract.Groups._ID));
        Intent intent = new Intent(MainActivity.this, ContactListActivity.class);
        intent.putExtra(ContactListActivity.EXTRA_GROUP_ID, groupId);
        startActivity(intent);
    }
});

删除分组

要删除一个已有的分组,可以使用ContentResolver的delete方法,并指定删除该分组的条件。代码如下:

ContentResolver resolver = getContentResolver();
Uri uri = ContactsContract.Groups.CONTENT_URI;
String where = ContactsContract.Groups._ID + " = ?";
String[] selectionArgs = new String[] { String.valueOf(groupId) };
resolver.delete(uri, where, selectionArgs);

联系人

联系人是通讯录的核心内容,包括姓名、电话号码、电子邮件地址等信息。在通讯录中,每个联系人都可以属于一个或多个分组,以便于分类管理。

显示联系人

要显示联系人列表,我们可以使用以下步骤:

  1. 在布局文件中添加一个ListView控件,用来显示联系人列表
<ListView
    android:id="@+id/contactListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  1. 在Activity中使用Loader来加载并显示联系人数据,和加载分组数据的步骤类似,这里不再赘述。需要注意的是,在处理Loader的回调函数中,需要使用CursorAdapter来将数据绑定到ListView上。

  2. 在Activity中处理ListView的点击事件,跳转到联系人编辑页面,并将该联系人的id作为参数传递给编辑页面。示例代码如下:

mContactListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Cursor cursor = (Cursor) adapterView.getItemAtPosition(i);
        int contactId = cursor.getInt(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
        Intent intent = new Intent(MainActivity.this, ContactEditActivity.class);
        intent.putExtra(ContactEditActivity.EXTRA_CONTACT_ID, contactId);
        startActivity(intent);
    }
});

新建联系人

要新建一个联系人,可以使用ContactsContract.RawContacts.CONTENT_URI和ContentValues两个类。以下代码演示了如何创建一个新联系人,并插入数据库中。

ContentValues values = new ContentValues();
long rawContactId = ContentUris.parseId(getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values));
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Tom");
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

删除联系人

要删除一个已有的联系人,也可以使用ContentResolver的delete方法,并指定删除该联系人的条件。代码如下:

ContentResolver resolver = getContentResolver();
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String where = ContactsContract.Contacts._ID + " = ?";
String[] selectionArgs = new String[] { String.valueOf(contactId) };
resolver.delete(uri, where, selectionArgs);

示例

这里提供两个综合了上述分组和联系人功能的示例,供读者参考:
- Android通讯录分组Demo
- Android通讯录Demo(分组+联系人)

以上就是Android个人手机通讯录开发的详细攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android个人手机通讯录开发详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java微信公众号开发之通过微信公众号获取用户信息

    Java微信公众号开发之通过微信公众号获取用户信息 简介 本文将详细讲解如何通过Java实现微信公众号获取用户信息细节,包括获取用户基本信息和获取关注者列表,最后提供两条常用的示例说明。 准备工作 在开始获取用户信息之前,你需要进行以下步骤的准备工作: 注册微信公众号,并获取关注者OpenID和Access Token. 创建Java Web服务器,并引入相…

    Java 2023年5月26日
    00
  • java虚拟机学习笔记进阶篇

    Java虚拟机学习笔记进阶篇攻略 本文旨在为读者提供Java虚拟机学习笔记进阶篇的学习攻略,包括必要的准备知识、学习方法、学习重点等内容。 准备知识 在学习Java虚拟机进阶篇之前,需要对Java虚拟机的基础知识有清晰的理解,包括但不限于: Java虚拟机的体系结构和工作原理; Java虚拟机的内存模型和内存管理机制; Java字节码的结构、格式和指令集; …

    Java 2023年5月23日
    00
  • Springboot整合Freemarker的实现详细过程

    下面我将详细讲解Spring Boot整合Freemarker的实现过程。 一、添加Freemarker依赖 首先,在项目的pom.xml文件中添加Freemarker的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g…

    Java 2023年5月19日
    00
  • Spring Boot整合Spring Security简单实现登入登出从零搭建教程

    Spring Boot整合Spring Security简单实现登入登出从零搭建教程 Spring Security是一个功能强大且灵活的框架,用于保护Spring应用程序。在Spring Boot应用程序中,我们可以使用Spring Security来实现用户认证和授权。本文将详细讲解Spring Boot整合Spring Security简单实现登入登出…

    Java 2023年5月15日
    00
  • Java的Struts框架报错“DuplicateForwardException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“DuplicateForwardException”错误。这个错误通常由以下原因之一起: 重复的转发名称:如果在配置文件中定义了重复的转发名称,则可能会出现此错误。在这种情况下,需要删除重复的转发名称以解决此问题。 重复的转发路径:如果在配置文件中定义了重复的转发路径,则可能会出现此错误。在这种情况下,需要删除…

    Java 2023年5月5日
    00
  • 分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存

    接下来我将为您详细讲解“分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存”的完整攻略。 简介 分布式医疗挂号系统是一种可以为病人提供在线挂号、医生排队、诊断和用药等创新医疗系统。在此系统中,我们照常将业务逻辑和数据库中已缓存的数据保留存储,以便我们能够快速存取数据并提高网站的访问速度。这就需要我们利用缓存技术为数据字典添加缓存。这里将演…

    Java 2023年5月19日
    00
  • AngualrJS中每次$http请求时的一个遮罩层Directive

    为了在 AngularJS 发送 $http 请求时展示进度条或遮罩层效果,我们可以创建自定义 Directive。下面是一个实现 $http 遮罩层的完整攻略: 第一步:创建遮罩层 Directive 我们可以创建一个自定义的 Directive,把遮罩层模板添加到页面中。在请求使用 $http 发送请求前,遮罩层应该是不可见的,当请求被发出时,遮罩层应该…

    Java 2023年6月15日
    00
  • Mybatis中的常用OGNL表达式

    Mybatis是一个支持OGNL表达式的Java持久层框架,OGNL表达式在Mybatis中十分常用,可以对语句中的参数进行处理和转换,使得SQL语句的灵活性更高,同时也可以更好地利用数据库的性能。 1. OGNL表达式概览 OGNL表达式是一个对象图导航语言,用于访问Java对象的属性和方法。OGNL表达式可以用于动态SQL语句中的查询条件、属性映射、对象…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部