Как получить контакты Android в формате Vcard, используя собственный API Android - PullRequest
2 голосов
/ 07 ноября 2011

Я пытаюсь прочитать контакты устройства Android в формате VCard с помощью Android Api. Я нашел одну ссылку для того же: Android contatcs vcard API

и пытается написать тот же код, но он не работает, так как я не могу получить ключ поиска:

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);  
int num = cur.getCount();  // I get 2 , as there are two contacts

String lookupKey = cur.getString(cur.getColumnIndex(Contacts.LOOKUP_KEY));
// The above line gives error : android.database.CursorIndexOutOfBoundsException:
//  Index -1 requested, with a size of 2

Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd = resolver.openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();
    byte[] b = new byte[(int)fd.getDeclaredLength()];
fis.read(b);
String vCard = new String(b);
sb.append(vCard);

Может кто-нибудь сказать, пожалуйста, как получить ключ поиска для вышеуказанного кода, или есть какой-нибудь другой способ получения контактов в формате VCard с использованием Android API.

Ответы [ 3 ]

7 голосов
/ 08 марта 2012

Вот вы:

Cursor cursor = context.getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

if (cursor != null && cursor.moveToFirst()) {
    try {
        do {
            String lookupKey = cursor.getString(cursor
                    .getColumnIndex(Contacts.LOOKUP_KEY));


            Uri uri = Uri.withAppendedPath(
                    ContactsContract.Contacts.CONTENT_VCARD_URI,
                    lookupKey);
            AssetFileDescriptor fd;
            try {
                fd = context.getContentResolver()
                        .openAssetFileDescriptor(uri, "r");
                FileInputStream fis = fd.createInputStream();
                byte[] b = new byte[(int) fd.getDeclaredLength()];
                fis.read(b);
                String vCard = new String(b);
                Log.i(TAG, vCard);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } while (cursor.moveToNext());
    } finally {
        cursor.close();
    }
}
1 голос
/ 07 ноября 2011

- Редактировать 2 ---

Похоже, что вы не выполняете cur.moveToFirst () перед чтением курсора, поэтому вы получаете исключение.попробуйте заглянуть в android.database.CursorIndexOutOfBoundsException: индекс -1 запрошен , который описывает ту же проблему.

- отредактированный ответ -

LookUpKey в коде для конкретного контакта.Пример conde, который вы используете, - это получение vcard для определенного контакта.Вы должны зациклить доступные контакты, и внутри вы можете поместить код, который вам нужен, чтобы он заработал.Вы можете получить ключ поиска из контактного контракта.

Кроме этого, вы должны рассмотреть следующее общее решение:

  1. Пожалуйста, добавьте ошибку, которую вы получили в logcat
  2. Вы добавили разрешение на контакт в манифест приложения, чтобы приложение могло читать контакты?
0 голосов
/ 03 апреля 2014
public static void getVCF() {
    final String vfile = "Contacts.csv";
    Cursor phones = mContext.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
            null, null);
    phones.moveToFirst();

    do {
        String lookupKey = phones.getString(phones
                .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));

        Uri uri = Uri.withAppendedPath(
                ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
        AssetFileDescriptor fd;
        try {
            fd = mContext.getContentResolver().openAssetFileDescriptor(uri,
                    "r");
            FileInputStream fis = fd.createInputStream();
            byte[] buf = new byte[(int) fd.getDeclaredLength()];
            fis.read(buf);
            String VCard = new String(buf);
            String path = Environment.getExternalStorageDirectory()
                    .toString() + File.separator + vfile;
            FileOutputStream mFileOutputStream = new FileOutputStream(path,
                    true);
            mFileOutputStream.write(VCard.toString().getBytes());
            phones.moveToNext();
            Log.d("Vcard", VCard);
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    } while (phones.moveToNext());

}
...