如何在Android中通过二维码将vCard添加到联系人应用程序



我有一个应用程序,其中的部分功能是用户将生成二维码,其他用户可以扫描并获取联系方式,并直接添加到他们的联系人中。

所以我将vCard的详细信息编码为以下格式:

String str =
"BEGIN:VCARDn" +
"VERSION:3.0rn" +
"N:" + userDetailsModel.getLastName() + ";" + userDetailsModel.getFirstName() + ";;Mr;rn" +
"FN:" + "Mr." + userDetailsModel.getFirstName() + " " + userDetailsModel.getLastName() + "rn" +
"ORG:" + userDetailsModel.getCompany() + "rn" +
"TITLE:" + userDetailsModel.getDesignation() + "rn" +
"EMAIL:" + userDetailsModel.getEmail() + "rn" +
"TEL;CELL:" + userDetailsModel.getPhone() + "rn" +
"END:VCARDrn";

然后,在扫描后收到这个字符串后,我将其写入一个文件,然后开始对该文件进行意向操作,以打开并添加到联系人。以下是我的代码:

VCard vCard = Ezvcard.parse(qrResultDataString).first();
writeToFile(qrResultDataString);
Intent intent = new Intent(Intent.ACTION_VIEW);
File path = new File(getApplicationContext().getExternalFilesDir(null), "contactFile.vcf");
try {
VCardWriter writer = new VCardWriter(path, VCardVersion.V3_0);
writer.write(vCard);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}

Uri uri = Uri.parse(path.getPath());
intent.setDataAndType(uri, "text/x-vcard"); //storage path is path of your vcf file and vFile is name of that file.
startActivity(intent); 

忽略EZvcard部分。

因此,我可以选择添加到联系人,当我选择任何联系人应用程序时,toast都会显示文本";无法导入vCard";。我在logcat中也没有收到任何错误消息。请帮忙。

我不知道这是否是您需要的

//GENERATE QR
private void generateQR(User user) {
String str =
"BEGIN:VCARDn" +
"VERSION:3.0rn" +
"N:" + user.getSurname() + ";" + user.getName() + ";;Mr;rn" +
"FN:" + "Mr." + user.getName() + " " + user.getSurname() + "rn" +
"EMAIL:" + user.getEmail() + "rn" +
"TEL;CELL:" + user.getPhone() +"rn" +
"END:VCARDrn";

QRCodeWriter writer = new QRCodeWriter();
try {
BitMatrix bitMatrix = writer.encode(str, BarcodeFormat.QR_CODE, 512, 512);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE);
}
}
image.setImageBitmap(bmp);

} catch (WriterException e) {
e.printStackTrace();
}
}

经过多次搜索和尝试,我终于找到了答案。这太傻了。第一件事是我忘了使用文件提供程序,因为我的目标是API 24级以上。另一个是我在使用提供者后没有使用下面的标志。

Uri uri = FileProvider.getUriForFile(
ShareScreen.this,
"com.alphapublishing.digitalbusinesscard.provider",
path);
intent.setDataAndType(uri,"text/x-vcard"); 
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

这篇文章的来源:android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData((暴露在应用程序之外

最新更新