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. Python读取Excel数据并根据列名取值

    一直想将自己接触到的东西梳理一遍,可就是迈不出第一步,希望从这篇总结开始不要再做行动的矮人了. 最近测试过程中需要用到python读取excel用例数据,于是去了解和学习了下xlrd库,这里只记录使用 ...

  2. Python web框架有哪些

    简单易学的web.py, 大型的django:文档最完善.市场占有率最高.招聘职位最多. Tornado 具体看:http://feilong.me/2011/01/talk-about-python ...

  3. 第一种:NStread

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  4. linux grep详解

    Table of Contents 1. grep简介 2. grep正则表达式元字符集(基本集) 3. 用于egrep和 grep -E的元字符扩展集 4. POSIX字符类 5. Grep命令选项 ...

  5. Java集合中对象排序

    集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...

  6. swift:打造你自己的折线图

    看到苹果Health里的折线图了吗.我们就是要打造一个这样的折线图.没看过的请看下图. 我们的主题在于折线图本身.其他的包括步数.日平均值等描述类的内容这里就不涉及了. 首先观察,这个图种包含些什么组 ...

  7. 异常语句:try(尝试)-catch(抓取)-finally 跳转语句:break

    跳转语句: 1.break:跳出的意思,如果在循环语句中使用则是跳出循环2.default,--默认语句通常与 switch case 配合使用3.continue--跳过一个,继续下一个继续retu ...

  8. A - Oil Deposits(搜索)

    搜索都不熟练,所以把以前写的一道搜索复习下,然后下一步整理搜索和图论和不互质的中国剩余定理的题 Description GeoSurvComp地质调查公司负责探测地下石油储藏. GeoSurvComp ...

  9. c++,static 静态成员变量 / 静态成员函数

    静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...

  10. 动态规划---最长上升子序列问题(O(nlogn),O(n^2))

    LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) . ******* ...