从Android的contacts2.db中导出vcard联系人方法,只简单说明下步骤

1:拿到contacts2.db文件

两种方法

(1):通过手机的RE管理工具将目录data/data/com.android.providers.contacts/databases/contacts2.db文件拷贝出来

(2):通过Recovery备份的文件data.img用unyaff程序解压缩后,可找到对应的data/data/com.android.providers.contacts/databases/contacts2.db文件,该方法适用于进不了系统的情况

2:使用java sqlite驱动包

下载地址:http://www.ch-werner.de/javasqlite/

3:使用android的vcard jar包

下载地址:http://code.google.com/p/android-vcard/

4:编写java代码进行数据的导出

(1):先读取数据库中contacts表,生成用户名和ID的对象

(2):遍历用户列表,根据用户ID读取raw_contacts和data表获取号码、地址等信息(两个表需要关联)

判断表中mimetype_id类型,一般mimetype_id值的定义:3: 地址 data1 5: 手机号码 data1 8: 名称 data1全名 data2名 data3姓 9:其他信息 data1地址 data4职位

(3):遍历用户列表,将用户信息导出到vcard文件

附上代码:

UserData

package org.rwl;

import java.util.ArrayList;

import java.util.List;

/**

* Created with PolarRwl.

* User: polarrwl

* Date: 13-5-23

* Time: 下午3:46

* To change this template use File | Settings | File Templates.

*/

public class UserData {

private String userid;

private String name;

private String email;

private String address;

private String duty;

private List phones = new ArrayList();

public String getUserid() {

return userid;

}

public void setUserid(String userid) {

this.userid = userid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public List getPhones() {

return phones;

}

public void setPhones(List phones) {

this.phones = phones;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public String getDuty() {

return duty;

}

public void setDuty(String duty) {

this.duty = duty;

}

public String toString() {

String result = "";

result += "ID:(" + userid;

result += ") 姓名:(" + name;

result += ") 邮件:(" + email;

result += ") 号码:(" + phones;

result += ") 地址:(" + address;

result += ") 职位:(" + duty;

result += ")";

return result;

}

}

TestSqlite

package org.rwl.sqlite;

import a_vcard.android.provider.Contacts;

import a_vcard.android.syncml.pim.vcard.ContactStruct;

import a_vcard.android.syncml.pim.vcard.VCardComposer;

import org.rwl.UserData;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.sql.*;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* Created with PolarRwl.

* User: polarrwl

* Date: 13-5-23

* Time: 下午2:55

* To change this template use File | Settings | File Templates.

*/

public class TestSqlite {

public static void main(String[] args) {

Map repeat = new HashMap();

System.out.println("读取所有的联系人");

List theDataList = getAllContacts();

System.out.println("处理联系人号码信息");

for(UserData uData : theDataList) {

analyseUserOtherData(uData);

}

System.out.println("打印联系人信息:");

int i= 0;

for(UserData uData : theDataList) {

i++;

// System.out.println(i + ":" + uData);

// exportToVcard(uData);

if(repeat.get(uData.getName()) != null) {

System.out.println("重名:" + uData + "[" + repeat.get(uData.getName()) + "]");

}

repeat.put(uData.getName(), uData);

}

}

/**

* mimetype_id

* 3: 地址 5: 手机号码 8: 名称 data1全名 data2名 data3姓 9: data1地址 data4职位 10:

*

* @param _udata

*/

public static void analyseUserOtherData(UserData _udata) {

Connection conn = null;

try {

conn = getConnection2();

Statement stmt = conn.createStatement();

String sql = "select * from raw_contacts t1, data t2 where t1._id = t2.raw_contact_id";

sql += " and t1.contact_id = " + _udata.getUserid();

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()) {

int mimetype_id = rs.getInt("mimetype_id");

String data1 = rs.getString("data1");

String data2 = rs.getString("data2");

String data3 = rs.getString("data3");

String data4 = rs.getString("data4");

if(mimetype_id == 3) {

_udata.setAddress(data1);

} else if(mimetype_id == 5) {

if(data1 != null && !_udata.getPhones().contains(data1)) {

_udata.getPhones().add(data1);

}

} else if(mimetype_id == 9) {

_udata.setAddress(data1);

_udata.setDuty(data4);

}

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if(conn != null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

}

}

}

}

public static void exportToVcard(UserData _data) {

OutputStreamWriter writer = null;

try {

writer = new OutputStreamWriter(new FileOutputStream("outputvcard/" + _data.getName() + ".vcf"), "UTF-8");

VCardComposer composer = new VCardComposer();

ContactStruct contact1 = new ContactStruct();

contact1.name = _data.getName();

contact1.company = "";

contact1.notes = new ArrayList();

contact1.notes.add(_data.getAddress());

for(int i=0; i<_data.getphones i>

if(_data.getPhones().get(i).length() == 11) {

contact1.addPhone(Contacts.Phones.TYPE_MOBILE, _data.getPhones().get(i), null, true);

} else {

contact1.addPhone(Contacts.Phones.TYPE_OTHER, _data.getPhones().get(i), null, true);

}

}

//create vCard representation

String vcardString = composer.createVCard(contact1, VCardComposer.VERSION_VCARD30_INT);

//write vCard to the output stream

writer.write(vcardString);

writer.write("\n"); //add empty lines between contacts

// repeat for other contacts

// ...

} catch(Exception e) {

e.printStackTrace();

} finally {

if (writer != null) {

try {

writer.close();

} catch (IOException e) {

e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

}

}

}

}

public static List getAllContacts() {

List theResList = new ArrayList();

Connection conn = null;

try {

conn = getConnection2();

Statement stmt = conn.createStatement();

String sql = "select * from contacts";

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()) {

int theId = rs.getInt("_id");

String name = rs.getString("display_name");

if(name == null || name.length() < 0) {

continue;

}

UserData theData = new UserData();

theData.setUserid(""+theId);

theData.setName(name);

theResList.add(theData);

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if(conn != null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.

}

}

}

return theResList;

}

public static Connection getConnection2() {

Connection conn = null;

SQLite.Database db = null;

try {

Class.forName("SQLite.JDBCDriver").newInstance();

conn = DriverManager.getConnection("jdbc:sqlite:database/contacts2.db");

// java.lang.reflect.Method m =

// conn.getClass().getMethod("getSQLiteDatabase", null);

// db = (SQLite.Database) m.invoke(conn, null);

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

}

php 导出vcard,将Android的contacts2.db导出成vcard联系人的方法相关推荐

  1. 【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 )

    文章目录 一. Android 工程打包 二. Android Studio 打开 Unity 导出的 Android 工程 一. Android 工程打包 Android 工程打包 就是将 Unit ...

  2. android怎么导出代码吗,Android studio代码怎么导出为HTML格式?

    Android studio的开发的过程中,而想把的代码文件进行发送给别人看,是不可能直接把拷贝给被人的话,直接拷贝给别人话,格式会发生变化的,那么直接查看代码是不直观的,那么就需要进行导出HTML的 ...

  3. Android app本地图片转换成Drawable对象的方法

    app开发中把app的res下drawable的图片转换成drawable对象 也是常有的功能 下面就记录下两种转换的方法 第一种 方法 借助ContextCompat 转换方法 Drawable d ...

  4. 安卓通讯录系统mysql_Android手机通讯录项目开发--联系人数据库contacts2.db介绍

    项目描述:该项目为基于Android平台的手机通讯录,主要模块分为四个部分:联系人管理模块,通话记录管理模块,短信管理模块,系统设置模块. 系统结构图如下: 本项目启动时间:2014年5月28日 说明 ...

  5. 联系人数据库(contacts2.db)表和字段解析

    简介 ContactsContract.java这个类就是去解释和翻译这个contacts2.db数据库的.所有的联系人Uri,与联系人相关数据库字段均在此定义.这个类中有很多的内部接口和内部类,用来 ...

  6. 使用cardme读写VCard文件,实现批量导入导出电话簿

    转载自 使用cardme读写VCard文件,实现批量导入导出电话簿 首先下载jar包cardme. http://sourceforge.net/projects/cardme/?source=nav ...

  7. 由需求而产生的一款db导出excel的工具

    代码地址如下: http://www.demodashi.com/demo/12062.html 程序员最大的毛病可能就是懒,因为懒所以做出了许许多多提高自己工作效率的工具. 起因于我是商业开发,既然 ...

  8. android anr 文件路径,android出现ANR 如何导出anr文件

    1.老版Android系统 anr的导出 在项目目录下或app下运行命令: adb pull data/anr/traces.txt 1 测试了华为p7(Android 5.1.1)和荣耀v10(An ...

  9. android export apk,APKExport-APK导出

    -群主,你整理下群文件嘛,全是base.apk,都不知道是干嘛的! -这不怪我啊,企鹅自动重命名了--我空了就整理. 作为管理2000人大群的CEO,必须要想方设法为广大用户提供方便,所以神器APKE ...

  10. Android查看数据库“*.db“内容

    Android查看数据库"*.db"内容(包括本地文件.真机.虚拟机的方法) 使用android自带的SQLite,或者第三方的GreenDao等技术操作数据库时,查看内容有以下方 ...

最新文章

  1. python xlutils.copy_使用python的xlrd,xlwt和xlutils.copy保留样式
  2. c# Ajax后台动态分页
  3. 程序员太牛了 公司年会整成代码讨论会
  4. 华东师范大学计算机模拟试题,华东师范大学网院《计算机入门》模拟试题(卷)(ABCD卷合,含详细答案解析).doc...
  5. list 分组求和_数据分析-python-分组聚合-2
  6. [转载] python enumerate函数 实例_python中使用enumerate函数遍历元素实例
  7. Android Studio如何创建尺寸以及API通用的模拟器
  8. Oracle和sqlserver数据类型对应
  9. MariaDB基本操作--(创建用户)(转)
  10. ENVI4.8下载与安装步骤
  11. 项目_电商_淘淘商城_0000
  12. 如何在生化实验中选择合适的牛血清白蛋白(BSA)?
  13. win10升级补丁_win10教育版有什么优缺点
  14. 阿里云Landing Zone系列--2 资源目录之--多账号
  15. bzoj 1503 (权值线段树)
  16. 在线查看.doc,.docx,.ofd,.PDF,.WPS以及Office文档的在线解析方式。
  17. NVIDIA Jetson NX配置深度学习环境(Pytorch、torchvision)超级详细,torchvision安装避坑总结
  18. Mapper method ‘com.xxx.dao.ActivityDao.update attempted to return null from a method with a primiti
  19. 多功能计算机十二生肖,十二生肖那是真人实演的危险特技,不是电脑特效!
  20. 朴素贝叶斯分类的原理与流程——转张洋

热门文章

  1. 2020-11-30 03_空域图像处理 笔记
  2. 190413每日一句
  3. 浏览器关闭百度右侧的图片推荐---简洁就是美
  4. NASA-TLX (Task Load Index)量表学习总结
  5. unity 闪烁的gui button
  6. Atitit 物联网体系图 感知层 条码:物联网的第一代身份证 65二维码 4 电子标签:物联网的第二代身份证 78 4 传感器:物联网的神经元 92 4 自动识别技术 光学字符识别技术
  7. Atitit 研发体系 之道 attilax著 艾龙著 1. 发管理是一个完整的管理体系,从结构上来讲,它主要由四个方面的内容构架而成:组织结构与岗位设置 管理流程与工作流程、、项目及管道管理(
  8. Atitit atitit 编程语言之道补充 s22 attilax 艾龙 著 1. 程序设计是个什么概念呢?历史发展 1 1.1. 连接电缆 2 1.2. 程序内置纸带打点 2 1.3. FORT
  9. Atitit  Uncaught (in promise) SyntaxError Unexpected token in JSON at position 0
  10. paip.索引优化---sql distict—order by 法