【问题标题】:Get vCard from Contactdata Intent - Android从 Contactdata Intent 获取 vCard - 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 的格式中声明所有详细信息。

【问题讨论】:

    标签: android android-intent android-contacts vcf-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);
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2015-04-09
    • 2011-08-21
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多