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