如何为单个联系人创建 .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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

将所有联系人导出到 VCF (vcard) 文件 Windows phone

将联系人的照片写入vcf文件,android

使用联系人应用程序直接打开 .vcf vCard 文件

如何删除vcf文件中的重复联系人

以编程方式将 iPhone 联系人导出到 .vcf 文件

如何从网站将 vCard(.vcf 文件)导入 Android 联系人