android导入txt格式通讯录
2014-06-13 22:08
155 查看
步骤:1、从txt文本文档中取出数据 2、对数据进行封装处理 3、将封装后的数据插入数据库
MainActivity:
MainActivity:
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:
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; } }布局文件:
<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="导入联系人"> <textview android:id="@+id/main_tv" android:layout_width="wrap_content" android:layout_height="wrap_content"> </textview> </button> </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">
相关文章推荐
- Android导入导出txt通讯录工具(源码共享)
- android导出txt格式通讯录
- Android导入导出txt通讯录工具
- Android读取服务端TXT(JSON格式数据)返回汉字乱码的问题
- DB210.1版本如何导入Excel、txt格式的数据
- 怎么把Android手机的通讯录导入到iphone手机中
- java导入Excel包含多张sheet表的.xls .xslx .txt三种后缀格式的文件
- 导入android自带通讯录报错
- 以制表符分隔的TXT文件转换成Supermemo可直接导入的文本格式的过程图解
- 如何将txt格式的数据导入到MATLAB中,并绘制图线
- 以制表符分隔的TXT文件转换成Supermemo可直接导入的文本格式的过程图解
- Android 读取txt文件并以utf-8格式转换成字符串
- 导入导出:数据库导出Txt文本文件格式校验[原创]
- SQL导入txt以及SQL中的时间格式操作
- 【Android】Android阅读各种格式文件(包括DOC/DOCX/WPS/XLS/XLSX/PPT/PPTX/TXT/PDF)
- 解析VCARD文件(vcf格式)导入QQ通讯录功能
- 不用GMail从WM或Outlook导入联系人通讯录到Android手机的办法
- dbf转换到excel,改数据后---转txt 然后又foxpro导入为dbf格式,但是有点问题!
- 采用SHELL,通过SQL LOAD导入一定格式的txt文件至数据库中
- java easyreport 导入excel、 txt 数据数据格式校验(六)