android 导入数据(通讯录)

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

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

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

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

4、更新UI显示

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

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

MainActivity:

  1 package com.home.impcontact;
  2
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.IOException;
  6 import java.util.ArrayList;
  7 import android.app.Activity;
  8 import android.app.AlertDialog;
  9 import android.content.ContentUris;
 10 import android.content.ContentValues;
 11 import android.content.Context;
 12 import android.content.DialogInterface;
 13 import android.net.Uri;
 14 import android.os.Bundle;
 15 import android.os.Environment;
 16 import android.os.Handler;
 17 import android.os.Message;
 18 import android.provider.ContactsContract;
 19 import android.provider.ContactsContract.RawContacts;
 20 import android.provider.ContactsContract.CommonDataKinds.Phone;
 21 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 22 import android.provider.ContactsContract.Contacts.Data;
 23 import android.view.View;
 24 import android.view.View.OnClickListener;
 25 import android.widget.Button;
 26 import android.widget.TextView;
 27 import android.widget.Toast;
 28
 29 public class MainActivity extends Activity implements OnClickListener {
 30     private Button btn;// 导入按钮
 31     private TextView show;// 显示结果的文本框
 32     private Thread addThread;// 增加联系人线程
 33     private static final int ADD_FAIL = 0;// 导入失败标识
 34     private static final int ADD_SUCCESS = 1;// 导入成功标识
 35     private static int successCount = 0;// 导入成功的计数
 36     private static int failCount = 0;// 导入失败的计数
 37     // 默认文件路劲,实际情况应作相应修改或从界面输入或浏览选择
 38     private static final String PATH = Environment
 39             .getExternalStorageDirectory() + "/我的联系人.txt";
 40
 41     @Override
 42     protected void onCreate(Bundle savedInstanceState) {
 43         super.onCreate(savedInstanceState);
 44         setContentView(R.layout.main);
 45         init();
 46     }
 47
 48     /**
 49      * 初始化组件
 50      */
 51     private void init() {
 52         btn = (Button) findViewById(R.id.main_btn);
 53         btn.setOnClickListener(this);
 54         show = (TextView) findViewById(R.id.main_tv);
 55     }
 56
 57     @Override
 58     public void onClick(View v) {
 59         if (v == btn) {
 60             addContact();
 61         }
 62     }
 63
 64     /**
 65      * 导入联系人入口
 66      */
 67     private void addContact() {
 68         if (!new File(PATH).exists()) {
 69             Toast.makeText(this, "文件不存在!", Toast.LENGTH_SHORT).show();
 70             show.setText("文件不存在!");
 71             return;
 72         }
 73         if (addThread != null) {
 74             addThread.interrupt();
 75             addThread = null;
 76         }
 77         addThread = new Thread(new AddRunnable(this, PATH));
 78         createDialog(this, "警告", "确保你是第一次导入,重复导入会创建新的联系人,请慎用!");
 79     }
 80
 81     /**
 82      * 创建提示对话框
 83      *
 84      * @param context
 85      * @param title
 86      * @param message
 87      */
 88     private void createDialog(Context context, String title, String message) {
 89         AlertDialog.Builder builder = new AlertDialog.Builder(context);
 90         builder.setTitle(title);
 91         builder.setMessage(message);
 92         builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
 93             public void onClick(DialogInterface dialog, int whichButton) {
 94                 startAddContact();
 95             }
 96         });
 97         builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {
 98             public void onClick(DialogInterface dialog, int whichButton) {
 99                 dialog.cancel();
100             }
101         });
102         builder.show();
103     }
104
105     /**
106      * 开启导入线程
107      */
108     private void startAddContact() {
109         setAddWidgetEnabled(false);
110         show.setText("正在导入联系人...");
111         if (addThread != null) {
112             addThread.start();
113         }
114     }
115
116     class AddRunnable implements Runnable {
117         private Context context;
118         private String path;
119
120         public AddRunnable(Context context, String path) {
121             this.path = path;
122             this.context = context;
123         }
124
125         @Override
126         public void run() {
127             boolean result = importContact(context, path);
128             if (result) {
129                 handler.sendEmptyMessage(ADD_SUCCESS);
130             } else {
131                 handler.sendEmptyMessage(ADD_FAIL);
132             }
133         }
134     }
135
136     /**
137      * 处理UI相关的handler
138      */
139     private Handler handler = new Handler() {
140         @Override
141         public void handleMessage(Message msg) {
142             switch (msg.what) {
143             case ADD_FAIL:
144                 show.setText("导入联系人失败");
145                 setAddWidgetEnabled(true);
146                 break;
147             case ADD_SUCCESS:
148                 show.setText(String.format("导入联系人成功 %d 条,失败 %d 条",
149                         successCount, failCount));
150                 setAddWidgetEnabled(true);
151                 break;
152             }
153         }
154     };
155
156     /**
157      * 设置导入组件的可用性
158      *
159      * @param enabled
160      */
161     private void setAddWidgetEnabled(boolean enabled) {
162         btn.setEnabled(enabled);
163         if (!enabled) {
164             show.setText("");
165         }
166     }
167
168     /**
169      * 导入联系人
170      *
171      * @param context
172      * @param path
173      * @return
174      */
175     private boolean importContact(Context context, String path) {
176         successCount = 0;
177         failCount = 0;
178         try {
179             ArrayList<contactinfo> list = readFromFile(path);
180             if (list == null) {
181                 return false;
182             }
183             for (int i = 0; i < list.size(); i++) {
184                 ContactInfo info = list.get(i);
185                 if (doAddContact(context, info)) {
186                     successCount++;
187                 }
188             }
189         } catch (Exception e) {
190             e.printStackTrace();
191             return false;
192         }
193         return true;
194     }
195
196     /**
197      * 读取联系人并封装成ContactInfo对象集合
198      *
199      * @param path
200      * @return contactsList
201      */
202     private ArrayList<contactinfo> readFromFile(String path) {
203         ArrayList<string> strsList = doReadFile(path);
204         if (strsList == null) {
205             return null;
206         }
207         ArrayList<contactinfo> contactsList = handleReadStrs(strsList);
208         return contactsList;
209     }
210
211     /**
212      * 将读出来的内容封装成ContactInfo对象集合
213      *
214      * @param strsList
215      * @return
216      */
217     private ArrayList<contactinfo> handleReadStrs(ArrayList<string> strsList) {
218         ArrayList<contactinfo> contactsList = new ArrayList<contactinfo>();
219         for (int i = 0; i < strsList.size(); i++) {
220             String info = strsList.get(i);
221             String[] infos = info.split("\\s{2,}");
222             String displayName = null;
223             String mobileNum = null;
224             String homeNum = null;
225             switch (infos.length) {
226             case 0:
227                 continue;
228             case 1:
229                 displayName = infos[0];
230                 break;
231             case 2:
232                 displayName = infos[0];
233                 if (infos[1].length() >= 11) {
234                     mobileNum = infos[1];
235                 } else {
236                     homeNum = infos[1];
237                 }
238                 break;
239             default:
240                 // length >= 3
241                 displayName = infos[0];
242                 mobileNum = infos[1];
243                 homeNum = infos[2];
244             }
245             if (displayName == null || "".equals(displayName)) {
246                 failCount++;
247                 continue;
248             }
249             contactsList.add(new ContactInfo(displayName, mobileNum, homeNum));
250         }
251         return contactsList;
252     }
253
254     /**
255      * 读取文件内容
256      *
257      * @param path
258      * @return
259      */
260     private ArrayList<string> doReadFile(String path) {
261         FileInputStream in = null;
262         ArrayList<string> arrayList = new ArrayList<string>();
263         try {
264             byte[] tempbytes = new byte[1 << 24];
265             in = new FileInputStream(path);
266             while (in.read(tempbytes) != -1) {
267                 int length = 0;
268                 int first = length;
269                 for (int i = 0; i < tempbytes.length; i++) {
270                     if (tempbytes[i] == ‘\n‘) {
271                         length = i;
272                         byte[] nowBytes = new byte[length - first];
273                         System.arraycopy(tempbytes, first, nowBytes, 0, length
274                                 - first);
275                         arrayList.add(new String(nowBytes, "utf-8").trim());
276                         first = i + 1;
277                     }
278                 }
279
280             }
281         } catch (Exception e1) {
282             return null;
283         } finally {
284             if (in != null) {
285                 try {
286                     in.close();
287                 } catch (IOException e1) {
288                     return null;
289                 }
290             }
291         }
292         return arrayList;
293     }
294
295     /**
296      * 向数据库表插入联系人信息
297      *
298      * @param context
299      * @param contactInfo
300      * @return
301      */
302     private boolean doAddContact(Context context, ContactInfo contactInfo) {
303         try {
304             ContentValues contentValues = new ContentValues();
305             Uri uri = context.getContentResolver().insert(
306                     RawContacts.CONTENT_URI, contentValues);
307             long rowId = ContentUris.parseId(uri);
308
309             String name = contactInfo.getDisplayName();
310             String mobileNum = contactInfo.getMobileNum();
311             String homeNum = contactInfo.getHomeNum();
312
313             // 插入姓名
314             if (name != null) {
315                 contentValues.clear();
316                 contentValues.put(Data.RAW_CONTACT_ID, rowId);
317                 contentValues.put(Data.MIMETYPE,
318                         StructuredName.CONTENT_ITEM_TYPE);
319                 int index = name.length() / 2;
320                 String displayName = name;
321                 String givenName = null;
322                 String familyName = null;
323                 // 检查是否是英文名称
324                 if (checkEnglishName(displayName) == false) {
325                     givenName = name.substring(index);
326                     familyName = name.substring(0, index);
327                 } else {
328                     givenName = familyName = displayName;
329                 }
330                 contentValues.put(StructuredName.DISPLAY_NAME, displayName);
331                 contentValues.put(StructuredName.GIVEN_NAME, givenName);
332                 contentValues.put(StructuredName.FAMILY_NAME, familyName);
333                 context.getContentResolver().insert(
334                         ContactsContract.Data.CONTENT_URI, contentValues);
335             }
336
337             if (mobileNum != null) {
338                 // 插入手机电话
339                 contentValues.clear();
340                 contentValues.put(Data.RAW_CONTACT_ID, rowId);
341                 contentValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
342                 contentValues.put(Phone.NUMBER, mobileNum);
343                 contentValues.put(Phone.TYPE, Phone.TYPE_MOBILE);
344                 context.getContentResolver().insert(
345                         ContactsContract.Data.CONTENT_URI, contentValues);
346             }
347
348             if (homeNum != null) {
349                 // 插入家庭号码
350                 contentValues.clear();
351                 contentValues.put(Data.RAW_CONTACT_ID, rowId);
352                 contentValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
353                 contentValues.put(Phone.NUMBER, homeNum);
354                 contentValues.put(Phone.TYPE, Phone.TYPE_HOME);
355                 context.getContentResolver().insert(
356                         ContactsContract.Data.CONTENT_URI, contentValues);
357             }
358         } catch (Exception e) {
359             return false;
360         }
361         return true;
362     }
363
364     /**
365      * 检查是否是英文名称
366      *
367      * @param name
368      * @return
369      */
370     private boolean checkEnglishName(String name) {
371         char[] nameChars = name.toCharArray();
372         for (int i = 0; i < nameChars.length; i++) {
373             if ((nameChars[i] >= ‘a‘ && nameChars[i] <= ‘z‘)
374                     || (nameChars[i] >= ‘A‘ && nameChars[i] <= ‘Z‘)) {
375                 continue;
376             }
377             return false;
378         }
379         return true;
380     }
381 }

联系人实体类ContactInfo:

 1 package com.home.impcontact;
 2
 3 public class ContactInfo {
 4     /** 名称 */
 5     private String displayName;
 6     /** 手机号 */
 7     private String mobileNum;
 8     /** 家庭电话 */
 9     private String homeNum;
10
11     public ContactInfo(String displayName, String mobileNum, String homeNum) {
12         this.displayName = displayName;
13         this.mobileNum = mobileNum;
14         this.homeNum = homeNum;
15     }
16
17     public String getDisplayName() {
18         return displayName;
19     }
20
21     public String getMobileNum() {
22         return mobileNum;
23     }
24
25     public String getHomeNum() {
26         return homeNum;
27     }
28 }

布局文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6
 7     <Button
 8         android:id="@+id/main_btn"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:text="导入联系人" >
12     </Button>
13         <TextView
14             android:id="@+id/main_tv"
15             android:layout_width="wrap_content"
16             android:layout_height="wrap_content" >
17         </TextView>
18
19
20 </LinearLayout>

权限:

1    <uses-permission android:name="android.permission.READ_CONTACTS">
2    <uses-permission android:name="android.permission.WRITE_CONTACTS">
3    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
5
6
7 </uses-permission></uses-permission></uses-permission>

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

注:布局文件小改

时间: 2024-12-13 18:52:31

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

【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

[Android 仿微信通讯录 导航分组列表-上]使用ItemDecoration为RecyclerView打造带悬停头部的分组列表 一 概述 本文是Android导航分组列表系列上,因时间和篇幅原因分上下,最终上下合璧,完整版效果如下: 上部残卷效果如下:两个ItemDecoration,一个实现悬停头部分组列表功能,一个实现分割线(官方demo) 网上关于实现带悬停分组头部的列表的方法有很多,像我看过有主席的自定义ExpandListView实现的,也看过有人用一个额外的父布局里面套 Rec

android 导入自己的生成的jar,老是 could not find class

最近开始学习android,开发一个小项目,功能很简单,就是从服务器上获取数据,之后显示在手机上.打算把访问服务器的功能打包成一个jar文件.然后android 引入jar包. 在eclipse 里 新建了一个java项目.之后完成代码测试,打包成jar文件 都很顺利.引用到android项目中,调试总报错,could not find class . 折腾了几天,都没有解决,几乎试遍 了,网上的所有方法都不行.后来突然意识到,是不是java项目的jar 不能引用到android 中.后来新建一

Android 添加数据到本地Excel表中

由于项目需要,今天学习了一下如何将程序里的数据添加到本地的Excel表中. 下面为学习笔记: 先上效果图: 首先,需要导入jxl.jar包到libs文件夹内. 然后创建Excel表,并往表里添加表头. // 创建excel表. public void createExcel(File file) { WritableSheet ws = null; try { if (!file.exists()) { // 创建表 wwb = Workbook.createWorkbook(file); //

Android 个人手机通讯录开发

一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示                2. 文件结构简单分析 三.个人手机通讯录代码实现 1. 清单文件 (AndroidManifest.xml) <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http

mysql导入数据load data infile用法整理

有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间. 假如是从MySql客户端调用,将客户端的文件导入,则需要使用 load local data infile. LOAD DATA INFILE 语句以很高的速度从一个文本文件中读取行到一个表中.文件名必须是一个文字字符串. 1,开启load local data infile. 假如是Linux下

oracle sqlldr导入数据

背景 900W数据的TXT文本,文件内容各字段以"|"分隔,使用nevicat导入太慢 解决办法 使用sqlldr导入数据, 1)建立配置文件test.ctl [[email protected] ~]$ cat test.ctlload datainfile 'data.txt' into table CMCCfields terminated by "|"(id,phone,service_id,time,cmcc_num,cmcc_s) 解释:data.txt

DB2导入数据时乱码问题

1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016 ) 解决办法:set integrity for xxxxxx immediate checked 2.表锁定(原因码为7) 解决办法:reorg table xxxx 3.去重 select distinct a.column from table1 as a inner join table2 as b

Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中.Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据.所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中! Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中

infobright中导入数据避免特殊字符问题

目前在用的是社区版的infobright,不支持DML功能,只能用LOAD DATA方式导入数据. 如果元数据中有特殊控制字符,导入过程中经常会报错,很是恼火.应对策略有两种方法: 设置Reject File导入之前,设定 @BH_REJECT_FILE_PATH 和 @BH_ABORT_ON_COUNT 就可以忽略多少条导入失败的记录,并且将这些记录保存在指定文件 /** when the number of rows rejected reaches 10, abort process **