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

Posted

技术标签:

【中文标题】使用联系人应用程序直接打开 .vcf vCard 文件【英文标题】:Open .vcf vCard file directly with contacts app 【发布时间】:2014-04-07 23:03:56 【问题描述】:

我正在尝试以编程方式启动联系人应用程序以导入包含大量联系人的大型 .vcf 文件。以下代码几乎可以完美运行。

String vcfMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("vcf");
Intent openVcfIntent = new Intent(Intent.ACTION_VIEW);
openVcfIntent.setDataAndType(Uri.fromFile(savedVCardFile), vcfMimeType);
startActivity(openVcfIntent);

唯一的问题是 android 显示了一个应用选择器对话框,不仅显示联系人应用,还显示 Dropbox(或任何其他处理 vCard 文件的应用)。我想防止这种行为,并直接用联系人应用打开文件,以便自动开始导入。

我尝试了在 *** 上找到的几件事,但都没有成功,例如设置:

openVcfIntent.setComponent(new ComponentName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivity"));
openVcfIntent.setAction("android.intent.action.MAIN");                                                                       
openVcfIntent.addCategory("android.intent.category.LAUNCHER");                                                               
openVcfIntent.addCategory("android.intent.category.DEFAULT");                                                                

关于如何解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

回答我自己的问题。感谢this answer about explicit intents,我终于找到了一种使用联系人应用程序自动打开电子名片的方法。

private void openBackup(File savedVCard)

    try
    
        String vcfMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("vcf");
        Intent openVcfIntent = new Intent(Intent.ACTION_VIEW);
        openVcfIntent.setDataAndType(Uri.fromFile(savedVCard), vcfMimeType);
        // Try to explicitly specify activity in charge of opening the vCard so that the user doesn't have to choose
        // https://***.com/questions/6827407/how-to-customize-share-intent-in-android/9229654#9229654
        try
        
            if (getActivity().getPackageManager() != null)
            
                List<ResolveInfo> resolveInfos = getActivity().getPackageManager().queryIntentActivities(openVcfIntent, 0);
                if (resolveInfos != null)
                
                    for (ResolveInfo resolveInfo : resolveInfos)
                    
                        ActivityInfo activityInfo = resolveInfo.activityInfo;
                        if (activityInfo != null)
                        
                            String packageName = activityInfo.packageName;
                            String name = activityInfo.name;
                            // Find the needed Activity based on Android source files: http://grepcode.com/search?query=ImportVCardActivity&start=0&entity=type&n=
                            if (packageName != null && packageName.equals("com.android.contacts") && name != null && name.contains("ImportVCardActivity"))
                            
                                openVcfIntent.setPackage(packageName);
                                break;
                            
                        
                    
                
            
        
        catch (Exception ignored)
        
        

        startActivity(openVcfIntent);
    
    catch (Exception exception)
    
        // No app for openning .vcf files installed (unlikely)
    

【讨论】:

你在 getActivity() 中写了什么?

以上是关于使用联系人应用程序直接打开 .vcf vCard 文件的主要内容,如果未能解决你的问题,请参考以下文章

通讯录制作(.csv文件转.vcf文件即vcard格式)

手机上csv如何改为vcard

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

在 Windows 中使用 vCard 进行 UTF8 编码

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

使用适用于 Android 的 ez-vcard 库导入 VCard 文件