1、通过内容提供者获取联系人信息

 package com.ithaimazyh.readcontact;

 import java.util.ArrayList;
import java.util.List; import com.ithaimazyh.readcontact.domain.PersonInfo;
import com.ithaimazyh.readcontact.service.SavePersonsInfo; import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button rp = (Button) findViewById(R.id.rp);
rp.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
//System.out.println("hello world");
readContact();
}
});
} public void readContact(){
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri data_uri = Uri.parse("content://com.android.contacts/data"); ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null); /*String[] names = cursor.getColumnNames();
for(String name : names){
System.out.println(name);
}*/
List<PersonInfo> persons = new ArrayList<PersonInfo>();
while(cursor.moveToNext()){
String contact_id = cursor.getString(cursor.getColumnIndex("contact_id"));
if(contact_id != null){
String name = "";
String phoneNum = "";
Cursor datacursor = resolver.query(data_uri, null, "raw_contact_id=?", new String[]{contact_id}, null);
while(datacursor.moveToNext()){
String data1 = datacursor.getString(datacursor.getColumnIndex("data1"));
String mimetype = datacursor.getString(datacursor.getColumnIndex("mimetype")); //System.out.println(data1 + "-----" + mimetype);
if(mimetype.equals("vnd.android.cursor.item/name")){
name = data1;
}else if(mimetype.equals("vnd.android.cursor.item/phone_v2")){
phoneNum = data1;
}else{ }
} if(name != null && phoneNum != null){
PersonInfo person = new PersonInfo(name,phoneNum);
persons.add(person);
}
datacursor.close();
//System.out.print("=========================");
}
}
cursor.close(); SavePersonsInfo.savePersonsInfo(this, persons);
/* Cursor datacursor = resolver.query(data_uri, null, null, null, null);
String[] names = datacursor.getColumnNames();
for(String name : names){
System.out.println(name);
}*/
}
}

2、权限配置

  <uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

3、通过xml保存联系人信息

 package com.ithaimazyh.readcontact.service;

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.List; import org.xmlpull.v1.XmlSerializer; import com.ithaimazyh.readcontact.domain.PersonInfo; import android.content.Context;
import android.os.Environment;
import android.util.Xml;
import android.widget.Toast; public class SavePersonsInfo {
public static boolean savePersonsInfo(Context context, List<PersonInfo> persons){
if(persons.size() > 0){
try {
File file = new File(Environment.getExternalStorageDirectory(),"persons.xml");
FileOutputStream fos = new FileOutputStream(file);
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(fos, "utf-8");
serializer.startDocument("utf-8", true);
serializer.startTag(null, "persons"); for(PersonInfo person : persons){
serializer.startTag(null, "person"); serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name"); serializer.startTag(null, "phoneNum");
serializer.text(person.getPhoneNum());
serializer.endTag(null, "phoneNum"); serializer.endTag(null, "person");
} serializer.endTag(null, "persons");
serializer.endDocument(); fos.close();
Toast.makeText(context, "保存xml成功", 0).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(context, "保存xml失败", 0).show();
}
}
return true;
}
}

4、把文件保存在外存,权限配置

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

5、person类

 package com.ithaimazyh.readcontact.domain;

 public class PersonInfo {
private String name;
private String phoneNum; public PersonInfo() { } public PersonInfo(String name, String phoneNum) {
this.name = name;
this.phoneNum = phoneNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
}

注意:如果在查询数据时不知道列名,可以通过如下方法打印来了解

String[] columnNames = datacursor.getColumnNames();

使用内容提供者和xml备份联系人的更多相关文章

  1. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  2. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  3. Android基础笔记(十四)- 内容提供者读取联系人

    利用内容提供者读取联系人 利用内容提供者插入联系人 内容观察者的原理 利用内容观察者监听系统应用数据库或者自己应用数据库的变化 利用内容提供者读取联系人 读取联系人相对于读取短信来说就复杂非常多了,我 ...

  4. Android初级教程之内容提供者获取联系人信息

    内容提供折详细理论知识请参考之前的博文:http://blog.csdn.net/qq_32059827/article/details/51646513 这里新建了三个联系人信息,通过查看系统联系人 ...

  5. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  6. Android中的内容提供者

    Android中的内容提供者 为什么需要内容提供者 为了跨程序访问数据.试想如果在App-1中创建了一个私有数据库,App-2是不能直接访问的.因为权限不够,虽然可以使用chmod 777来修改权限, ...

  7. Android基础笔记(十三)- 内容提供者原理和简单使用

    为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信 为什么要有内容提供者 内容提供者技术的目的是: ...

  8. 安卓第十四天笔记-内容提供者(ContentProvider)

    安卓第十四天笔记-内容提供者(ContentProvider) ContentProvider--内容提供者 1.ContentProvider简介 ContentProvider是不同应用程序之间进 ...

  9. Android组件系列----ContentProvider内容提供者

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. android 破解九宫格

    将目录切换到D:/adb目录下,命令如下 敲入命令 adb shell 然后回车,可以见到如下结果 再敲入命令cd /data/system然后回车, 再执行 rm gesture.key 回车,搞定 ...

  2. IT第四天 - 运算符、随机数、Math类

    IT第四天 上午 运算符 1.%运算符的应用 2.运算符优先级:小括号 ! 算数运算符 关系运算符 && ||   赋值运算符 3.三元运算符:?表示条件为true的结果,:表示条件为 ...

  3. 利用KVC使用自定义的控件

    KVC简单使用: 可以用来设置属性的值例如有个Person类下有个属性name [self setvalue:@"yourname" forkey:@"name" ...

  4. Linux内核态抢占机制分析(转)

    Linux内核态抢占机制分析  http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html 摘 要]本文首先介绍非抢占式内核(Non-Preemptive ...

  5. python几个排序函数 sort sorted argsort

    Python中排序常用到的sort .sorted和argsort函数 [摘要:Python中sort 战 sorted函数 一 .先容 sort函数是list列表中的函数,而 sorted能够对li ...

  6. C++ cout 如何保留小数输出

    参考 : http://upliu.net/how-cout-out-2-precision.html 大家都知道用 C 语言中 printf () 函数可以非常方便控制保留 几位小数输出 不过在 C ...

  7. 面向对象程序设计-C++ Class & Object & Friend Function & Constructor & Destructor【第五次上课笔记】

    大家可以下载后用Vim 或者 Sublime Text等文本编辑器查看 以下代码均已折叠,点击“+“即可打开 一开始老师用C语言大作业的例子,写了个 Student 的结构以及相关操作 #includ ...

  8. Codeforces Round #253 (Div. 2), problem: (B)【字符串匹配】

    简易字符串匹配,题意不难 #include <stdio.h> #include <string.h> #include <math.h> #include < ...

  9. struts2总结【转载】

    1,struts2的form表单里面和url里面的传值以及Action所继承的父类都可以自动set属性注入action中,及继承的action中. 2,凡是url和form表单传值,在action方法 ...

  10. 为什么希捷选择了8GB作为标准的闪存容量呢?答案就在下面(新的驱动器可以实现一定程度上的写入缓存)

    与前两代Momentus XT产品不同,希捷称第三代混合硬盘所使用的技术更接近真正的SSHD(Solid State Hybrid Disk?),而不是HHD.也就是说更偏向于固态硬盘.首先它不会属于 ...