我正在尝试将所有联系人作为vCard。
所以这是我的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
if (cur.getCount() > 0) {
//cur.moveToFirst();
while (cur.moveToNext()) {
try{
String lookupKey =
cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri =
Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI,
lookupKey);
AssetFileDescriptor fd =
this.getContentResolver().openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();
byte[] buf = new byte[(int)fd.getDeclaredLength()];
if (0 < fis.read(buf))
{
String vCard = new String(buf);
System.out.println("The vCard value is " + vCard);
}
fis.close();
}
catch(Exception e)
{
System.out.println(e.getStackTrace());
}
}
}
cur.close();
System.out.println(cur.getCount());
}
}
这给了我几乎所有的联系人,但它没有返回一些包含一些特殊字符的联系人,在葡萄牙语中我们说“mãe”(妈妈)并且这段代码无法识别它。所有其他名称如“António”似乎都没有。
我已经坚持了很长时间。
答案 0 :(得分:2)
如果你想使用“内置”android类来生成你的vcards,那么它很简单。
public ArrayList<String> getContactsAsVcards()
{
ArrayList<String> vcards = new ArrayList<String>();
VCardComposer vCardComposer = new VCardComposer(context);
vCardComposer.init();
do {
String vCard = vCardComposer.createOneEntry();
vcards.add(vCard);
} while (!vCardComposer.isAfterLast());
return vcards;
}
您只需从android源代码下载android类,并使用正确的包名com.android.vcard
和com.android.vcard.exception
将它们添加到您的项目中。
您可以从here下载课程。这适用于Android 4.4 r1版本。
可能为你迟到但是如果有人正在寻找一种更健壮,更好的方式从他们的联系人列表中获取vcards并让android内部处理所有工作,这就是IMO。
答案 1 :(得分:1)
获得VCard的最佳方法是编写自己的函数来创建VCard。当联系人不是英语时,您使用的方式有问题。 手动获取联系人的所有字段并将其写入您的VCard文件。
查看https://code.google.com/p/android-vcard/来读取和写入VCard