从 Contactdata Intent 获取 vCard - Android

Posted

技术标签:

【中文标题】从 Contactdata Intent 获取 vCard - Android【英文标题】:Get vCard from Contactdata Intent - Android 【发布时间】:2014-07-22 00:04:50 【问题描述】:

让我们快速准确。 我正在寻找一种从我选择的联系人中获取 vCard 字符串的方法,该字符串通过意图传递给我的应用程序。

首先,我打算打开电话簿并选择一个联系人,如您在此代码中看到的那样,

mContext.startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE), 1);

在选择联系人后,结果将被传递到此处捕获的意图中

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1)    // RQS_PICK_CONTACT = 1
            if (resultCode == RESULT_OK) 
                Uri contactData = data.getData();
                Cursor cursor = managedQuery(contactData, null, null, null, null);
                cursor.moveToFirst();
                vCard = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                System.out.println(vCard);
            
        
    

在本例中,我只获取了为该联系人保存的号码。 但我的目标是在一个 vCard 字符串或另一种允许我将其转换为 vCard 的格式中声明所有详细信息。

【问题讨论】:

【参考方案1】:

我可以通过这条简单的线路来领取电子名片

Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);

这是获取 vCard 作为字符串的完整代码

public string vCard(Intent data)
Uri contactData = data.getData();

                    Cursor cursor = managedQuery(contactData, null, null, null, null);
                    cursor.moveToFirst();
                    String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
                    AssetFileDescriptor fd;
                    String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String nummer  = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    try 
                        fd = getContentResolver().openAssetFileDescriptor(uri, "r");
                        FileInputStream fis = fd.createInputStream();
                        byte[] buf = new byte[(int) fd.getDeclaredLength()];
                        fis.read(buf);
                        return new String(buf); //vCard from buffer
                     catch (Exception e) 
                        Toast.makeText(this, "Failed to load Contact: " + name, Toast.LENGTH_SHORT).show();
                        e.printStackTrace();
                    
return null; 

【讨论】:

vCard(Intent data)方法是怎么调用的?假设我想从 onCreate() 方法调用。并且 managedQuery(...) 在 API 17 中看起来被贬低了。还有什么替代品吗? 我把它当作 ActivityResult protected void onActivityResult(int requestCode, int resultCode, Intent data) super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1) if (resultCode == RESULT_OK) Uri contactData = data.getData(); [...] 这里也是一个示例,用于启动联系人的选择,该联系人作为 onActivityResult 中的意图返回到活动中 --- mContext.startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).setType(ContactsContract. CommonDataKinds.Phone.CONTENT_ITEM_TYPE), 1);

以上是关于从 Contactdata Intent 获取 vCard - Android的主要内容,如果未能解决你的问题,请参考以下文章

Android 从 Intent 获取 vCard 数据

从一个类中获取 Intent 值并将 Intent 设置为另一个类

Android 联系人列表获取地址

如何从 Android 中的 Intent 中获取联系信息?

从 Intent 中获取结果

Android:从 Intent 获取应用程序名称