zoukankan      html  css  js  c++  java
  • 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] == '
    ') {
    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

    注:布局文件小改

  • 相关阅读:
    一种在【微服务体系】下的【参数配置神器】
    阅读源代码之“那是我的青春”
    我谈防御式编程
    博客开篇
    redis-sentinel-cluster-codis
    redis-复制
    redis-持久化
    redis-事件
    圆角矩形精度条
    小程序---canvas画图,生成分享图片,画图文字换行
  • 原文地址:https://www.cnblogs.com/jenson138/p/4098045.html
Copyright © 2011-2022 走看看