Reputation: 71
I am making use of the ezvcard library to export contact data out of my own app. My problem is, the exported vcard cannot be read in my stock contacts app. This is the output:
BEGIN:VCARD
VERSION:4.0
N:;User Name;;;
FN:User Name
ORG:Anderson Secondary School
TEL;TYPE=work,voice:92365313
PRODID:ez-vcard 0.9.9
END:VCARD
BEGIN:VCARD
VERSION:4.0
N:;All fields 2;;;
FN:All fields 2
ORG:List (All fields)
TEL;TYPE=work,voice:12345678
PRODID:ez-vcard 0.9.9
END:VCARD
and below, my codes to create the vCard
LayoutInflater li = SettingsPortationActivity.this.getLayoutInflater();
View promptsView = li.inflate(R.layout.prompts, null);
fileName = "";
fileNameInput = (EditText) promptsView.findViewById(R.id.editTextDialogUserInput);
fileNameInput.setText(".vcf");
AlertDialog.Builder builder = new AlertDialog.Builder(SettingsPortationActivity.this);
// sets prompts to alertdialog builder
builder.setView(promptsView);
builder.setCancelable(false)
.setPositiveButton("Save", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fileName = fileNameInput.getText().toString();
if (!fileName.trim().isEmpty()) { // has value
FavoritesDatabaseHelper db = new FavoritesDatabaseHelper(getApplicationContext());
List<FavoriteObject> favorites = db.getAllFavorites();
List<VCard> vcards = new ArrayList<VCard>();
String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + fileName;
File file = new File(storage_path);
Log.d("Directory", String.valueOf(storage_path));
VCardWriter writer = null;
try {
writer = new VCardWriter(file, VCardVersion.V4_0);
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < favorites.size(); i++) {
FavoriteObject fav = favorites.get(i);
Log.d("Export fav", "Fav name" + fav.getContactName());
VCard vcard = new VCard();
vcard.setClassification("PUBLIC");
StructuredName n = new StructuredName();
n.setGiven(fav.getContactName());
vcard.setStructuredName(n);
vcard.setFormattedName(new FormattedName(fav.getContactName()));
Organization org = new Organization();
org.addValue(fav.getListName());
vcard.setOrganization(org);
Telephone tel = new Telephone(fav.getContactNumber());
tel.addType(TelephoneType.WORK);
tel.addType(TelephoneType.VOICE);
vcard.addTelephoneNumber(tel);
vcards.add(vcard);
}
try {
for (VCard vcard : vcards) {
try {
writer.write(vcard);
} catch (IOException e) {
e.printStackTrace();
}
}
} finally {
try {
writer.close();
Log.d("Success", "Export success");
Toast.makeText(SettingsPortationActivity.this, "Export Success", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
fileNameInput.setError("Please enter a file name");
}
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
Upvotes: 2
Views: 1509
Reputation: 4645
Are you actually leveraging any vCard 4.0 functionality ? If it is not the case, I would start by setting the version to 3.0 instead of 4.0. Unfortunately, very few softwares have moved to vCard 4.0.
Would also put the PRODID towards the begining of the stream as this may help some parsers.
Upvotes: 3