从CSV和VCF文件中获取联系人信息
??上一篇文章中我們實現了從系統的聯系人數據庫中獲取聯系人信息。文章鏈接:http://blog.csdn.net/github_36878269/article/details/73826289
??但是技術總監又提出了新的需求,用戶想從文件中導入聯系人信息,比如從華為手機助手中導出的聯系人文件。在網上查找了許多的答案,有使用第三方的jar包的,比如什么我也忘了,很是坑爹。所以索性就自己分析導出的文件,從流中讀取數據。
在實體機上使用系統聯系人應用新建幾個聯系人,連接電腦,使用華為手機助手導出聯系人。
??1.導出為CSV格式。
導出的文件內容為:
?耐心的去分析其中數據表達的信息,該文件在windows上提示為”逗號分隔值文件”,是由引號,引號中的內容和逗號組成的。第一行為聯系人信息字段,從第二行開始,每一行代表一個聯系人信息,其中每一個”“中的內容為第一行字段對應的數據。比如第二行中的”張三”對應第一行中的”Given Name”,即用戶姓名。
?根據這個文件格式我們可以從中獲取我們想要的信息。下邊是我的實現代碼。
//fileExtend為選中文件的地址后綴。 if(fileExtend.equals("csv")){//處理CSV格式數據。EntityContact contact = null;try {while((buffer = reader.readLine()) != null){if(buffer.startsWith("\"")){contact = new EntityContact();//聯系人信息行,從中選擇我們想要的信息。String [] infos = buffer.split(",");contact.setName(nullChange(infos[1])); //聯系人姓名。contact.setMobile_num(nullChange(infos[5])); //聯系人手機號。contact.setHome_num(nullChange(infos[6]));//家用電話。contact.setOffice_num(nullChange(infos[7]));//工作電話。contact.setEmail(nullChange(infos[13]));//Email。contact.setHome_address(nullChange(infos[17]));//家庭住址。contact.setOffice_address(nullChange(infos[18]));//工作地址contact.setExtend(nullChange(infos[31]));//備注。contacts.add(contact);//放入集合。}}} catch (Exception e) {//數據格式有問題。contacts = null;} }private static String nullChange(String data){return (data.equals("") ? null : data.replace("\"", "")); }?我們就可以從contacts這個鏈表中獲取文件中的聯系人信息了。csv格式中不存放聯系人的頭像信息,所以我們就無法從中獲取聯系人的頭像信息。但vcf格式的可以。
??2.vcf格式。
還是分析從華為手機助手導出的聯系人文件(.vcf)。
這種格式和csv格式不同,一條聯系人數據占用很多行,以”BEGIN:VCARD”為開始,以”END:VCARD”為結束,其中的每行數據代表聯系人中的一條信息。如TEL;CELL:13966665555為聯系人?”lisi”?的電話號碼。根據這個尿性,我們可以寫出如下代碼: //fileExtend為選中文件的地址后綴。 if(fileExtend.equals("vcf")){//處理VCF格式數據。EntityContact contact = null;while((buffer = reader.readLine()) != null){if(buffer.equals("BEGIN:VCARD")){//開始標識符。contact = new EntityContact();} else if(buffer.startsWith("N:;")){//名字。buffer = buffer.substring(buffer.indexOf(";") + 1, buffer.lastIndexOf(";;;"));contact.setName(buffer);} else if(buffer.startsWith("TEL;CELL")){//手機號。buffer = buffer.substring(buffer.indexOf(":") + 1);contact.setMobile_num(buffer);} else if(buffer.startsWith("TEL;WORK;VOICE:")){//工作號碼。buffer = buffer.substring(buffer.indexOf(":") + 1);contact.setOffice_num(buffer);} else if(buffer.startsWith("TEL;HOME;VOICE:")){//家用號碼。buffer = buffer.substring(buffer.indexOf(":") + 1);contact.setHome_num(buffer);} else if(buffer.startsWith("EMAIL;HOME:")){buffer = buffer.substring(buffer.indexOf(":") + 1);contact.setEmail(buffer);} else if(buffer.startsWith("ADR;HOME:")){buffer = buffer.substring(buffer.indexOf(":") + 1, buffer.lastIndexOf(";;;;;;"));contact.setHome_address(buffer);} else if(buffer.startsWith("ADR;WORK:")){buffer = buffer.substring(buffer.indexOf(":") + 1, buffer.lastIndexOf(";;;;;;"));contact.setOffice_address(buffer);} else if(buffer.startsWith("NOTE;WORK:")){buffer = buffer.substring(buffer.indexOf(":") + 1);contact.setExtend(buffer);} else if(buffer.startsWith("PHOTO;")){//頭像數據。buffer = buffer.substring(buffer.indexOf(":") + 1);contact.setPhoto(buffer);}else if(buffer.equals("END:VCARD")){//結束標識符。contacts.add(contact);}} }
?是不是很簡單呢?
總結下解決流程:1.從網上查閱資料,無果,最后放棄。2.從導出的文件中,分析數據,得到數據代表的信息,將數據解析獲取想要的信息。
?如果有不足的地方還請大家指出,謝謝。
下次我還會介紹這兩種格式的文件的導出,以及如何獲取系統目錄(外部存儲,USB存儲)并獲取文件選中的地址。
總結
以上是生活随笔為你收集整理的从CSV和VCF文件中获取联系人信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 键盘 自动消失,andr
- 下一篇: mpq