`
JasonShieh
  • 浏览: 527526 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android联系人数据库全解析(4)

阅读更多
Working With Android Contacts

Wrapper class

The wrapper class below is what will be invoked by applications. This class will determine the API level running on the device/emulator and load the correct class created on the next pages. To determine the correct Android API running the Build.VERSION.SDK variable is queried. This version code is then compared against the Eclair (2.0) version code stored in Build.VERSION_CODES.ECLAIR. Finally the proper API class is loaded.
package com.higherpass.android.ContactAPI;

import android.os.Build;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;

import com.highercollaboration.android.ContactAPI.objects.*;
public abstract class ContactAPI {

private static ContactAPI api;

private Cursor cur;
private ContentResolver cr;

public static ContactAPI getAPI() {
if (api == null) {
String apiClass;
if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.ECLAIR) {
apiClass = "com.highercollaboration.android.ContactAPI.ContactAPISdk5";
} else {
apiClass = "com.highercollaboration.android.ContactAPI.ContactAPISdk3";
}

try {
Class<? extends ContactAPI> realClass = Class.forName(apiClass).asSubclass(ContactAPI.class);
api = realClass.newInstance();
} catch (Exception e) {
throw new IllegalStateException(e);
}

}
return api;
}

public abstract Intent getContactIntent();

public abstract ContactList newContactList();

public abstract Cursor getCur();
public abstract void setCur(Cursor cur);

public abstract ContentResolver getCr();
public abstract void setCr(ContentResolver cr);

}
2.0 Data access class

This class takes what was covered on page 1 of the tutorial about the Android 2.0 Contact API and turns it into a class. This class extends and will be invoked by the wrapper class created previously.
package com.higherpass.android.ContactAPI;

import java.util.ArrayList;

import com.highercollaboration.android.ContactAPI.objects.*;

import android.content.Intent;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.content.ContentResolver;

public class ContactAPISdk5 extends ContactAPI {

private Cursor cur;
private ContentResolver cr;


public Cursor getCur() {
return cur;
}

public void setCur(Cursor cur) {
this.cur = cur;
}

public ContentResolver getCr() {
return cr;
}

public void setCr(ContentResolver cr) {
this.cr = cr;
}

public Intent getContactIntent() {
return(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI));
}

public ContactList newContactList() {
ContactList contacts = new ContactList();
String id;

this.cur = this.cr.query(ContactsContract.Contacts.CONTENT_URI,
                 null, null, null, null);
if (this.cur.getCount() > 0) {
while (cur.moveToNext()) {
Contact c = new Contact();
id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
c.setId(id);
c.setDisplayName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
c.setPhone(this.getPhoneNumbers(id));
}
c.setEmail(this.getEmailAddresses(id));
c.setNotes(this.getContactNotes(id));
c.setAddresses(this.getContactAddresses(id));
c.setImAddresses(this.getIM(id));
c.setOrganization(this.getContactOrg(id));
contacts.addContact(c);
}
}
return(contacts);
}

public ArrayList<Phone> getPhoneNumbers(String id) {
ArrayList<Phone> phones = new ArrayList<Phone>();

Cursor pCur = this.cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
phones.add(new Phone(
pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
, pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))
));

}
pCur.close();
return(phones);
}

public ArrayList<Email> getEmailAddresses(String id) {
ArrayList<Email> emails = new ArrayList<Email>();

Cursor emailCur = this.cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id}, null);
while (emailCur.moveToNext()) {
    // This would allow you get several email addresses
Email e = new Email(emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))
,emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)) 
);
emails.add(e);
}
emailCur.close();
return(emails);
}

public ArrayList<String> getContactNotes(String id) {
ArrayList<String> notes = new ArrayList<String>();
String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters = new String[]{id,
ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
Cursor noteCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null);
if (noteCur.moveToFirst()) {
String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
if (note.length() > 0) {
notes.add(note);
}
}
noteCur.close();
return(notes);
}

public ArrayList<Address> getContactAddresses(String id) {
ArrayList<Address> addrList = new ArrayList<Address>();

String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters = new String[]{id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};

Cursor addrCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null);
while(addrCur.moveToNext()) {
String poBox = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String street = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String city = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String state = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String postalCode = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String country = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String type = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
Address a = new Address(poBox, street, city, state, postalCode, country, type);
addrList.add(a);
}
addrCur.close();
return(addrList);
}

public ArrayList<IM> getIM(String id) {
ArrayList<IM> imList = new ArrayList<IM>();
String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters = new String[]{id,
ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};

Cursor imCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null);
if (imCur.moveToFirst()) {
String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
String imType;
imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
if (imName.length() > 0) {
IM im = new IM(imName, imType);
imList.add(im);
}
}
imCur.close();
return(imList);
}

public Organization getContactOrg(String id) {
Organization org = new Organization();
String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters = new String[]{id,
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};

Cursor orgCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null);

if (orgCur.moveToFirst()) {
String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
if (orgName.length() > 0) {
org.setOrganization(orgName);
org.setTitle(title);
}
}
orgCur.close();
return(org);
}

}
分享到:
评论

相关推荐

    android 解析 开机加载SIM联系人及对SIM卡联系人的操作

    ### Android解析:开机加载SIM联系人及对SIM卡联系人的操作 #### 一、概述 在Android系统中,用户能够方便地访问并管理SIM卡上的联系人信息,这些功能背后涉及到了一系列复杂的交互机制和技术实现。本文将详细介绍...

    Android@联系人功能

    这通常涉及到读取Android的ContactsContract数据库,筛选出用户可能需要@的联系人信息,如姓名和唯一标识。 3. **显示联系人选择界面**:创建一个Dialog或者BottomSheet,展示联系人列表。列表项应包含联系人头像、...

    android联系人二维码生成以及扫描

    综上所述,"android联系人二维码生成以及扫描"这个主题涵盖了Android应用开发中的多个重要技术点,包括二维码库的使用、数据编码与解码、相机权限处理以及用户界面设计等。开发者通过学习和实践这些内容,能够增强其...

    Android联系人总结

    Android系统的联系人管理功能是移动通信应用中的重要组成部分,本文将详细解析Android系统中与联系人相关的数据库架构与数据存储方式,帮助开发者更好地理解和掌握Android联系人数据库的工作原理及其实现细节。...

    Android通过蓝牙使用Pbap协议读取通讯录

    VCard数据在接收到OBEX GET请求响应后会被解析,然后可以存储到Android系统的联系人数据库中。 在实际开发过程中,你需要遵循以下步骤: 1. 检查并启用蓝牙,搜索支持PBAP的远程设备,并进行配对。 2. 创建...

    Android 异步联系人备份与恢复Demo

    - 将VCard导入到联系人:Android提供Intent ACTION_INSERT_OR_REPLACE,通过startActivityForResult()启动这个Intent,传递解析后的VCard数据,系统会自动处理导入过程。也可以使用ContentResolver的insert()方法,...

    android 支持分组和联系人展示的一个小例子(类似QQ首页)

    在Android中,联系人数据通常存储在系统提供的Contacts数据库中,可以通过ContentResolver进行查询和操作。分组则是联系人的组织形式,可以将相关的联系人归类到同一个分组下,便于管理和查找。 在"ContactProject...

    android扫描名片并解析名片源码

    同时,允许用户导出名片数据为CSV或VCF格式,便于导入其他联系人管理软件。 以上就是"android扫描名片并解析名片源码"中涉及的主要知识点,涵盖了从图像处理到数据存储的全过程,体现了Android应用开发的多个技术...

    Android应用源码高仿QQ客户端加服务端加数据库全套

    2. **用户界面(UI)设计**:仿QQ客户端意味着需要创建与QQ相似的用户界面,包括聊天界面、联系人列表、消息通知等。这涉及到对Android的自定义View和Adapter的深入理解和使用,以及对Material Design设计规范的理解。...

    Android短信联系人备份并上传

    在Android开发中,有时我们需要对用户的短信、联系人和通话记录等重要数据进行备份,以防止数据丢失。本文将深入探讨如何实现这个功能,并讲解如何将备份的数据上传到JavaWeb服务器。 首先,我们要关注的是“短信和...

    android联系人contacts模块的学习总结

    以下是对Android联系人contacts模块及相关技术的学习总结。 首先,Android平台提供了多种数据存储方式,这包括文件方式、SharedPreferences以及嵌入式关系型数据库SQLite。对于文件存储方式,Android提供了标准的...

    安卓通讯录联系人打电话归属地相关-集成了省份城市银行银行支行联行号的android数据库使用方便字段可以通过三方软件进行查看.rar

    4. **第三方软件查看**:描述提到字段可以通过第三方软件查看,这意味着数据库设计可能包含了一些非标准的或者自定义的字段,这些字段可能需要特定的查询工具或者解析器才能正确解读。 5. **代码参考和调试**:由于...

    android 批量插入联系人、短信、通话记录,安装版,apk格式

    在Android系统中,批量操作是常见的需求,尤其是在处理大量数据如联系人、短信和通话记录时。本项目提供了一个解决方案,允许用户批量插入这些信息,特别解决了自Android 4.4版本后插入短信的限制问题。这个解决方案...

    安卓通讯录联系人打电话归属地相关-android手机号码归属地查询源码内附SQlite数据库并且有查询示例。.zip

    在Android平台上,开发一款应用程序来查询手机通讯录中的联系人号码归属地是一项常见的需求。这个压缩包提供的资源,包括源码、SQLite数据库以及相关的帮助文档,正是为了满足这样的需求。以下将详细介绍这些资源的...

    Android通讯录管理(获取联系人、通话记录、短信消息)

    这篇教程将深入探讨如何在Android应用中获取联系人信息、通话记录以及短信消息。首先,我们来了解一下基本概念。 1. **获取联系人信息**: Android提供了一套完整的API来访问和操作联系人数据。主要涉及`...

    Android程序研发源码Android 联系人快速索引源码.zip

    这个"Android程序研发源码Android 联系人快速索引源码.zip"文件包含的是一个关于如何实现Android联系人应用快速索引功能的源代码示例。快速索引功能使得用户可以迅速定位到特定联系人,极大地提高了用户体验。下面...

    Eclipse下编译Android自带联系人应用

    在本文中,我们将深入探讨如何在Eclipse环境中编译Android操作系统自带的联系人应用。首先,我们需要理解Eclipse作为一个集成开发环境(IDE)在Android应用开发中的角色,以及如何利用其特性来处理Android源码。 **...

    android-vcard-1.3.rar_VCardParser_V30_VCardSourceDetector_androi

    在Android中,`android-vcard.jar`库包含了对VCard的支持,使得开发人员能够方便地读取和写入VCard格式的联系人数据。 VCardParser V30是Android中处理V3.0版VCard的关键组件。它负责解析VCard文件或流,将其转换为...

    android4.0联系人Contacts源代码

    《Android 4.0 联系人Contacts源代码解析》 在Android系统中,联系人管理是核心功能之一,其背后的实现机制涉及到许多关键知识点。本篇文章将深入探讨Android 4.0(Ice Cream Sandwich)中Contacts应用的源代码,...

    Android 2.1 从SD卡导入联系人 vcf

    这个过程包括读取.vcf文件、解析文件内容、创建或更新联系人条目,并最终将它们插入到联系人数据库中。 1. **读取SD卡文件**: Android提供`Environment.getExternalStorageDirectory()`方法获取SD卡的根目录,...

Global site tag (gtag.js) - Google Analytics