从 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的主要内容,如果未能解决你的问题,请参考以下文章
从一个类中获取 Intent 值并将 Intent 设置为另一个类