接着android 中导出数据 一文,下面介绍在android中导入数据的思路:

1、将数据从文本中读取出来

2、封装处理成自己想要的对象或模型

3、将处理好的数据对象插入自己应用的数据库

4、更新UI显示

下面仍以导入联系人至系统中为例,若是导入自己的应用中,思路一样甚至更简单,代码如下:

注:我的联系人.txt的格式即为android 中导出数据 一文生成的格式

MainActivity:

 package com.home.impcontact;

 import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener {
private Button btn;// 导入按钮
private TextView show;// 显示结果的文本框
private Thread addThread;// 增加联系人线程
private static final int ADD_FAIL = 0;// 导入失败标识
private static final int ADD_SUCCESS = 1;// 导入成功标识
private static int successCount = 0;// 导入成功的计数
private static int failCount = 0;// 导入失败的计数
// 默认文件路劲,实际情况应作相应修改或从界面输入或浏览选择
private static final String PATH = Environment
.getExternalStorageDirectory() + "/我的联系人.txt"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
} /**
* 初始化组件
*/
private void init() {
btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(this);
show = (TextView) findViewById(R.id.main_tv);
} @Override
public void onClick(View v) {
if (v == btn) {
addContact();
}
} /**
* 导入联系人入口
*/
private void addContact() {
if (!new File(PATH).exists()) {
Toast.makeText(this, "文件不存在!", Toast.LENGTH_SHORT).show();
show.setText("文件不存在!");
return;
}
if (addThread != null) {
addThread.interrupt();
addThread = null;
}
addThread = new Thread(new AddRunnable(this, PATH));
createDialog(this, "警告", "确保你是第一次导入,重复导入会创建新的联系人,请慎用!");
} /**
* 创建提示对话框
*
* @param context
* @param title
* @param message
*/
private void createDialog(Context context, String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
startAddContact();
}
});
builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
builder.show();
} /**
* 开启导入线程
*/
private void startAddContact() {
setAddWidgetEnabled(false);
show.setText("正在导入联系人...");
if (addThread != null) {
addThread.start();
}
} class AddRunnable implements Runnable {
private Context context;
private String path; public AddRunnable(Context context, String path) {
this.path = path;
this.context = context;
} @Override
public void run() {
boolean result = importContact(context, path);
if (result) {
handler.sendEmptyMessage(ADD_SUCCESS);
} else {
handler.sendEmptyMessage(ADD_FAIL);
}
}
} /**
* 处理UI相关的handler
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case ADD_FAIL:
show.setText("导入联系人失败");
setAddWidgetEnabled(true);
break;
case ADD_SUCCESS:
show.setText(String.format("导入联系人成功 %d 条,失败 %d 条",
successCount, failCount));
setAddWidgetEnabled(true);
break;
}
}
}; /**
* 设置导入组件的可用性
*
* @param enabled
*/
private void setAddWidgetEnabled(boolean enabled) {
btn.setEnabled(enabled);
if (!enabled) {
show.setText("");
}
} /**
* 导入联系人
*
* @param context
* @param path
* @return
*/
private boolean importContact(Context context, String path) {
successCount = 0;
failCount = 0;
try {
ArrayList<contactinfo> list = readFromFile(path);
if (list == null) {
return false;
}
for (int i = 0; i < list.size(); i++) {
ContactInfo info = list.get(i);
if (doAddContact(context, info)) {
successCount++;
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
} /**
* 读取联系人并封装成ContactInfo对象集合
*
* @param path
* @return contactsList
*/
private ArrayList<contactinfo> readFromFile(String path) {
ArrayList<string> strsList = doReadFile(path);
if (strsList == null) {
return null;
}
ArrayList<contactinfo> contactsList = handleReadStrs(strsList);
return contactsList;
} /**
* 将读出来的内容封装成ContactInfo对象集合
*
* @param strsList
* @return
*/
private ArrayList<contactinfo> handleReadStrs(ArrayList<string> strsList) {
ArrayList<contactinfo> contactsList = new ArrayList<contactinfo>();
for (int i = 0; i < strsList.size(); i++) {
String info = strsList.get(i);
String[] infos = info.split("\\s{2,}");
String displayName = null;
String mobileNum = null;
String homeNum = null;
switch (infos.length) {
case 0:
continue;
case 1:
displayName = infos[0];
break;
case 2:
displayName = infos[0];
if (infos[1].length() >= 11) {
mobileNum = infos[1];
} else {
homeNum = infos[1];
}
break;
default:
// length >= 3
displayName = infos[0];
mobileNum = infos[1];
homeNum = infos[2];
}
if (displayName == null || "".equals(displayName)) {
failCount++;
continue;
}
contactsList.add(new ContactInfo(displayName, mobileNum, homeNum));
}
return contactsList;
} /**
* 读取文件内容
*
* @param path
* @return
*/
private ArrayList<string> doReadFile(String path) {
FileInputStream in = null;
ArrayList<string> arrayList = new ArrayList<string>();
try {
byte[] tempbytes = new byte[1 << 24];
in = new FileInputStream(path);
while (in.read(tempbytes) != -1) {
int length = 0;
int first = length;
for (int i = 0; i < tempbytes.length; i++) {
if (tempbytes[i] == '\n') {
length = i;
byte[] nowBytes = new byte[length - first];
System.arraycopy(tempbytes, first, nowBytes, 0, length
- first);
arrayList.add(new String(nowBytes, "utf-8").trim());
first = i + 1;
}
} }
} catch (Exception e1) {
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
return null;
}
}
}
return arrayList;
} /**
* 向数据库表插入联系人信息
*
* @param context
* @param contactInfo
* @return
*/
private boolean doAddContact(Context context, ContactInfo contactInfo) {
try {
ContentValues contentValues = new ContentValues();
Uri uri = context.getContentResolver().insert(
RawContacts.CONTENT_URI, contentValues);
long rowId = ContentUris.parseId(uri); String name = contactInfo.getDisplayName();
String mobileNum = contactInfo.getMobileNum();
String homeNum = contactInfo.getHomeNum(); // 插入姓名
if (name != null) {
contentValues.clear();
contentValues.put(Data.RAW_CONTACT_ID, rowId);
contentValues.put(Data.MIMETYPE,
StructuredName.CONTENT_ITEM_TYPE);
int index = name.length() / 2;
String displayName = name;
String givenName = null;
String familyName = null;
// 检查是否是英文名称
if (checkEnglishName(displayName) == false) {
givenName = name.substring(index);
familyName = name.substring(0, index);
} else {
givenName = familyName = displayName;
}
contentValues.put(StructuredName.DISPLAY_NAME, displayName);
contentValues.put(StructuredName.GIVEN_NAME, givenName);
contentValues.put(StructuredName.FAMILY_NAME, familyName);
context.getContentResolver().insert(
ContactsContract.Data.CONTENT_URI, contentValues);
} if (mobileNum != null) {
// 插入手机电话
contentValues.clear();
contentValues.put(Data.RAW_CONTACT_ID, rowId);
contentValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
contentValues.put(Phone.NUMBER, mobileNum);
contentValues.put(Phone.TYPE, Phone.TYPE_MOBILE);
context.getContentResolver().insert(
ContactsContract.Data.CONTENT_URI, contentValues);
} if (homeNum != null) {
// 插入家庭号码
contentValues.clear();
contentValues.put(Data.RAW_CONTACT_ID, rowId);
contentValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
contentValues.put(Phone.NUMBER, homeNum);
contentValues.put(Phone.TYPE, Phone.TYPE_HOME);
context.getContentResolver().insert(
ContactsContract.Data.CONTENT_URI, contentValues);
}
} catch (Exception e) {
return false;
}
return true;
} /**
* 检查是否是英文名称
*
* @param name
* @return
*/
private boolean checkEnglishName(String name) {
char[] nameChars = name.toCharArray();
for (int i = 0; i < nameChars.length; i++) {
if ((nameChars[i] >= 'a' && nameChars[i] <= 'z')
|| (nameChars[i] >= 'A' && nameChars[i] <= 'Z')) {
continue;
}
return false;
}
return true;
}
}

联系人实体类ContactInfo:

 package com.home.impcontact;

 public class ContactInfo {
/** 名称 */
private String displayName;
/** 手机号 */
private String mobileNum;
/** 家庭电话 */
private String homeNum; public ContactInfo(String displayName, String mobileNum, String homeNum) {
this.displayName = displayName;
this.mobileNum = mobileNum;
this.homeNum = homeNum;
} public String getDisplayName() {
return displayName;
} public String getMobileNum() {
return mobileNum;
} public String getHomeNum() {
return homeNum;
}
}

布局文件:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/main_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="导入联系人" >
</Button>
<TextView
android:id="@+id/main_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</TextView> </LinearLayout>

权限:

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

转:http://www.2cto.com/kf/201401/272625.html

注:布局文件小改

android 导入数据(通讯录)的更多相关文章

  1. android中数据存储

    android中数据存储     Android 中存储数据的方式有五种:SQLite数据库.文件存储.内容提供者.网络.SharedPreferences(Key----value)五种存储方式. ...

  2. Android 个人手机通讯录开发

    一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示                2. ...

  3. Android中数据存储(四)——ContentProvider存储数据

    目录(?)[+]   当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方 ...

  4. Android中数据存储(三)——SQLite数据库存储数据

    当一个应用程序在Android中安装后,我们在使用应用的过程中会产生很多的数据,应用都有自己的数据,那么我们应该如何存储数据呢? 数据存储方式 Android 的数据存储有5种方式: 1. Share ...

  5. Xamarin.Forms读取并展示Android和iOS通讯录 - TerminalMACS客户端

    Xamarin.Forms读取并展示Android和iOS通讯录 - TerminalMACS客户端 本文同步更新地址: https://dotnet9.com/11520.html https:// ...

  6. SQL SERVER导入数据到ORACLE的方法总结

    我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...

  7. Elasticsearch —— bulk批量导入数据

    在使用Elasticsearch的时候,一定会遇到这种场景--希望批量的导入数据,而不是一条一条的手动导入.那么此时,就一定会需要bulk命令! 更多内容参考我整理的Elk教程 bulk批量导入 批量 ...

  8. SQL Server导入数据时“启用标示插入”详解

    在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...

  9. MySQL 导入数据

    MySQL中可以使用两种简单的方式来导入MySQL导出的数据. 使用 LOAD DATA 导入数据 MySQL 中提供了LOAD DATA INFILE语句来插入数据. 以下实例中将从当前目录中读取文 ...

随机推荐

  1. python 学习笔记7(装饰器)

    闭包(closure)是函数式编程的重要的语法结构. 定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). def outer ...

  2. linux下搭建php的集成环境

    一个偶然的机会,在项目中需要搭建PHP的环境,由于PHP开发需要的东西比较多,像apache.mysql.PHP环境等,如果一个一个装很可能会有安装不全的问题,为此选择了安装集成环境,这里选择的是xa ...

  3. java集合-LinkedList

    一.概述 LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现. ...

  4. 【循序渐进学Python】15.网络编程

    Python 内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述. 1. 常用的网络设计模块 在标准库中有很多网络设计相关 ...

  5. 【MVC学习笔记01】初窥奥秘

    前言 最近工作落实了,是我非常喜欢的无线前端,会接触很多新东西啦,需要努力才行.因为会用到backbone,所以要学习MVC啦. MVC(模型-视图-控制器),这种模式最早被用于构建桌面程序和服务器端 ...

  6. Icon Font浅谈

    这周继续在弄hybird app 的 UI框架的重构,进行到了编写换肤功能的阶段,而在做换肤之前,我想应该先弄一套框架内置的图标. 而图标无非就是两种做法: 1.图片 使用图片很正常,但是有缺陷的. ...

  7. SharePoint 2013 REST 服务使用简介

    1.创建测试使用列表”REST Demo”,插入一些测试数据,如下图: 2.添加内容编辑器,并且添加脚本引用以及HTML代码,如下图: Result的Div为显示结果使用,input标签触发REST服 ...

  8. Merry Christmas & Happy New Year!!

    圣诞快乐,新年快乐!

  9. mac jdk 6设置

    新装的mac 系统10.10 ,jdk是1.8,因为一些工具要使用 jdk 6,以下是设置过程 查看版本 java -version 查看java是再哪:在/usr/bin/java whereis ...

  10. leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...