php 导出vcard,将Android的contacts2.db导出成vcard联系人的方法
从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联系人的方法相关推荐
- 【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 )
文章目录 一. Android 工程打包 二. Android Studio 打开 Unity 导出的 Android 工程 一. Android 工程打包 Android 工程打包 就是将 Unit ...
- android怎么导出代码吗,Android studio代码怎么导出为HTML格式?
Android studio的开发的过程中,而想把的代码文件进行发送给别人看,是不可能直接把拷贝给被人的话,直接拷贝给别人话,格式会发生变化的,那么直接查看代码是不直观的,那么就需要进行导出HTML的 ...
- Android app本地图片转换成Drawable对象的方法
app开发中把app的res下drawable的图片转换成drawable对象 也是常有的功能 下面就记录下两种转换的方法 第一种 方法 借助ContextCompat 转换方法 Drawable d ...
- 安卓通讯录系统mysql_Android手机通讯录项目开发--联系人数据库contacts2.db介绍
项目描述:该项目为基于Android平台的手机通讯录,主要模块分为四个部分:联系人管理模块,通话记录管理模块,短信管理模块,系统设置模块. 系统结构图如下: 本项目启动时间:2014年5月28日 说明 ...
- 联系人数据库(contacts2.db)表和字段解析
简介 ContactsContract.java这个类就是去解释和翻译这个contacts2.db数据库的.所有的联系人Uri,与联系人相关数据库字段均在此定义.这个类中有很多的内部接口和内部类,用来 ...
- 使用cardme读写VCard文件,实现批量导入导出电话簿
转载自 使用cardme读写VCard文件,实现批量导入导出电话簿 首先下载jar包cardme. http://sourceforge.net/projects/cardme/?source=nav ...
- 由需求而产生的一款db导出excel的工具
代码地址如下: http://www.demodashi.com/demo/12062.html 程序员最大的毛病可能就是懒,因为懒所以做出了许许多多提高自己工作效率的工具. 起因于我是商业开发,既然 ...
- android anr 文件路径,android出现ANR 如何导出anr文件
1.老版Android系统 anr的导出 在项目目录下或app下运行命令: adb pull data/anr/traces.txt 1 测试了华为p7(Android 5.1.1)和荣耀v10(An ...
- android export apk,APKExport-APK导出
-群主,你整理下群文件嘛,全是base.apk,都不知道是干嘛的! -这不怪我啊,企鹅自动重命名了--我空了就整理. 作为管理2000人大群的CEO,必须要想方设法为广大用户提供方便,所以神器APKE ...
- Android查看数据库“*.db“内容
Android查看数据库"*.db"内容(包括本地文件.真机.虚拟机的方法) 使用android自带的SQLite,或者第三方的GreenDao等技术操作数据库时,查看内容有以下方 ...
最新文章
- 简单图片浏览器的实现
- switch在C++中的用法以及用switch结构时要注意的问题(细节问题比较全面)
- Visual Studio 2010 -新特性,但我要的比这个更多!
- 将一个项目中已有的文档添加到另一个项目中的方法
- 583. 两个字符串的删除操作
- 获取iOS设备当前ip地址
- 多线程:三大不安全案例
- HDFS dfsclient写文件过程 源码分析
- ajax里面可以alert吗,Javascript和AJAX,仅在使用alert()时有效
- 初始化string对象的方式
- SAI2.0绘画软件中文版(已测可用)
- 主生产计划 操作教程 用友u8_【用友u8操作教程(用友财务软件u8实际操作教程)】免费在线试用_软件库_选软件网...
- 电脑ndows无法启动,电脑无法启动windows帮助和支持为什么?
- 将Linux 标准输出,错误输出重定向到文件
- 微信二维码生成步骤(本人亲测)
- 如何取消坚果云的分享链接
- 2015年年终总结学习篇:为了梦想不服输,再苦也不能停止脚步
- 研发人员欠缺的“不要脸”文化
- 12.pandas 读取与写入文件
- PCI GXL学习之安装篇
热门文章
- 第8章 多项式回归与模型泛化 学习笔记下
- 20191218每日一句
- 190309每日一句
- Atitit 理解参数 目录 1. 参数	1 1.1. 意义	1 1.2. 形式参数 实际参数	1 1.3. 默认参数 vs 必须参数	2 1.4. 位置参数,那么这个命名关键字参数	2 1.5. I
- Atitit 短信 技术的概论 短信备份 attilax总结 1.1. 短信的历史	1 1.2. 短信长度 160字的长度限制灵感来自对明信片的研究。明信片。大多数明信片上的字符不超过160个
- Atitit ocr识别原理 与概论 attilax总结
- Atiti qq空间破解(3)------------gui图形化通用cli执行器atiuse
- Atitit 判断判断一张图片是否包含另一张小图片
- 阿里云毕龙飞:五个维度推进企业生产关系数字化
- 张鹏程:7月24日阿里云上海峰会弹性计算大神