10

我想为一个包含联系信息的对象生成一个 .vcf 文件,如姓名、图像、电话号码、传真号码、电子邮件 ID、地址等。这个对象没有添加到电话的通讯录中,但它存储在我的应用。

生成我的 .vcf 文件后,我可以像这样发送此 vcard

Intent i = new Intent();
i.setAction(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("**generated.vcf**"), "text/x-vcard");
startActivity(i);

但我不知道如何获取这个生成的 .vcf 文件?

4

2 回答 2

27

生成 .vcf 文件实际上很容易。看看VCF 格式- 它是一个简单的文本文件。您需要做的就是创建文本文件并使用 VCF 字段将信息写入其中。你最终会得到这样的东西:

Person p = getPerson();

File vcfFile = new File(this.getExternalFilesDir(null), "generated.vcf");
FileWriter fw = new FileWriter(vcfFile);
fw.write("BEGIN:VCARD\r\n");
fw.write("VERSION:3.0\r\n");
fw.write("N:" + p.getSurname() + ";" + p.getFirstName() + "\r\n");
fw.write("FN:" + p.getFirstName() + " " + p.getSurname() + "\r\n");
fw.write("ORG:" + p.getCompanyName() + "\r\n");
fw.write("TITLE:" + p.getTitle() + "\r\n");
fw.write("TEL;TYPE=WORK,VOICE:" + p.getWorkPhone() + "\r\n");
fw.write("TEL;TYPE=HOME,VOICE:" + p.getHomePhone() + "\r\n");
fw.write("ADR;TYPE=WORK:;;" + p.getStreet() + ";" + p.getCity() + ";" + p.getState() + ";" + p.getPostcode() + ";" + p.getCountry() + "\r\n");
fw.write("EMAIL;TYPE=PREF,INTERNET:" + p.getEmailAddress() + "\r\n");
fw.write("END:VCARD\r\n");
fw.close();

Intent i = new Intent();
i.setAction(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.fromFile(vcfFile), "text/x-vcard");
startActivity(i);

(请注意,此代码要放在活动中。如果它不在活动中,则将this前面替换为getExternalFilesDir的实例Context。)

您可以根据需要拥有更多或更少的字段。如果字段值中有或字符,,则需要使用;对其进行转义。将换行符放入一个值中,写入文件(即文件本身必须包含,第二个斜杠用于转义换行符中的斜杠)。;\\\\n\n

这段代码相当粗糙,但它应该可以帮助您入门。再一次,看看 VCF 的格式,然后从那里开始。

更新:感谢@Michael 指出我原始答案中的错误。

于 2012-12-04T12:15:52.840 回答
4

您可能对使用 vCard 库而不是手动创建 vCard 字符串感兴趣。这样,您就不必担心所有格式细节,例如要转义的字符。 ez-vcard就是这样一个库。

使用 ez-vcard,@AleksG 的代码示例中的 vCard 将像这样生成:

Person p = getPerson();

File vcfFile = new File(this.getExternalFilesDir(null), "generated.vcf");

VCard vcard = new VCard();
vcard.setVersion(VCardVersion.V3_0);

StructuredNameType n = new StructuredNameType();
n.setFamily(p.getSurname());
n.setGiven(p.getFirstName());
vcard.setStructuredName(n);

vcard.setFormattedName(new FormattedNameType(p.getFirstName() + " " + p.getSurname()));

OrganizationType org = new OrganizationType();
org.addValue(p.getCompanyName());
vcard.setOrganization(org);

vcard.addTitle(new TitleType(p.getTitle()));

TelephoneType tel = new TelephoneType(p.getWorkPhone());
tel.addType(TelephoneTypeParameter.WORK));
tel.addType(TelephoneTypeParameter.VOICE));
vcard.addTelephoneNumber(tel);

tel = new TelephoneType(p.getHomePhone());
tel.addType(TelephoneTypeParameter.HOME));
tel.addType(TelephoneTypeParameter.VOICE));
vcard.addTelephoneNumber(tel);

AddressType adr = new AddressType();
adr.setStreetAddress(p.getStreet());
adr.setLocality(p.getCity());
adr.setRegion(p.getState());
adr.setPostalCode(p.getPostcode());
adr.setCountry(p.getCountry());
adr.addType(AddressTypeParameter.WORK);
vcard.addAddress(adr);

EmailType email = new EmailType(p.getEmailAddress());
email.addType(EmailTypeParameter.PREF);
email.addType(EmailTypeParameter.INTERNET);
vcard.addEmail(email);

vcard.write(vcfFile);

Intent i = new Intent();
i.setAction(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.fromFile(vcfFile), "text/x-vcard");
startActivity(i);
于 2012-12-05T16:56:55.120 回答