如何为单个联系人创建 .vcf 文件?
Posted
技术标签:
【中文标题】如何为单个联系人创建 .vcf 文件?【英文标题】:How can I create .vcf file for a single contact? 【发布时间】:2019-02-23 04:07:25 【问题描述】:我已经成功地为我的安卓设备上的所有联系人创建了 .vcf 文件。我已经参考了以下链接:
Export the Contacts as VCF file
而且它的工作非常好。 但是,我需要根据我的要求将单个联系人转换为单个 .vcf 文件。
在当前代码中,使用以下行获取所有联系人:
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
然后所有联系人都将包含在 .vcf 文件中。
那么,我可以通过什么方式为单个联系人生成 .vcf 文件?
【问题讨论】:
每次在链接中的 get() 方法代码中传递一个新文件名 请问你好吗?解释一下? 您了解该链接中 get() 方法的工作原理吗? 它从查找键中获取列索引,然后从该查找键生成 uri,然后该 Uri 用于初始化 AssetFileDescriptor。现在,AssetFileDescriptor 的这个对象用于初始化 FileInputStream 和 bytearray。 Bytearray 作为 read 方法的参数传递。最后,创建将要添加到 vCard ArrayList 中的字符串实例,该实例将使用 FileOutPutStream 保存。 请在下面查看我的答案。这就是我说的让您尝试一下。 【参考方案1】:请参见下面代码块中的第一行。这里我每次都新建一个vFile,这个方法会被调用,所以每个联系人都会被保存在不同的文件中。
public void get(Cursor cursor)
vfile = "Contacts" + "_" + System.currentTimeMillis()+".vcf";
//cursor.moveToFirst();
String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd;
try
fd = this.getContentResolver().openAssetFileDescriptor(uri, "r");
// Your Complex Code and you used function without loop so how can you get all Contacts Vcard.??
/* FileInputStream fis = fd.createInputStream();
byte[] buf = new byte[(int) fd.getDeclaredLength()];
fis.read(buf);
String VCard = new String(buf);
String path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
FileOutputStream out = new FileOutputStream(path);
out.write(VCard.toString().getBytes());
Log.d("Vcard", VCard);*/
FileInputStream fis = fd.createInputStream();
byte[] buf = new byte[(int) fd.getDeclaredLength()];
fis.read(buf);
String vcardstring= new String(buf);
vCard.add(vcardstring);
String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile;
FileOutputStream mFileOutputStream = new FileOutputStream(storage_path, false);
mFileOutputStream.write(vcardstring.toString().getBytes());
catch (Exception e1)
// TODO Auto-generated catch block
e1.printStackTrace();
【讨论】:
我刚刚添加了一个 int 标志,例如: String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + vfile+""+flag;标志=标志+1; 但是,先生,请问您好吗?建议我如果我想要联系人字段的用户输入,我可以采用哪个字段,然后在按下按钮单击时,给定的输入将生成到 .vcf。因为以这种当前方式,如果在用户的设备中如果有 1000 个联系人,那么将创建 1000 个 .vcf 文件。或者,有没有办法让我可以选择特定的联系人,然后将其转换为 .vcf ?谢谢。 为此,首先向用户显示带有复选框的联系人列表,以选择要在 vcf 中转换的联系人。然后只转换选定的联系人 先生,另一个问题是它完成了任务,但没有用户确认。我该怎么办?我怎样才能在这里实现 AsyncTask 或其他什么? 只需在asynctask的doInBackground中使用上述方法代码以上是关于如何为单个联系人创建 .vcf 文件?的主要内容,如果未能解决你的问题,请参考以下文章