2011-11-07 1 views
2

J'essaie de lire les contacts de l'appareil Android au format VCard en utilisant Android Api. je l'ai trouvé un lien pour le même: Android contatcs vcard APIComment obtenir des contacts android au format Vcard en utilisant l'API native Android

et essayer d'écrire le même code mais sa ne fonctionne pas, car je ne suis pas en mesure d'obtenir le lookupkey:

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); 

Quelqu'un peut-il s'il vous plaît me dire comment pour obtenir le lookupkey pour le code ci-dessus ou il y a un autre moyen que nous pouvons obtenir des contacts format VCard en utilisant Android api.

Répondre

1

- Edit 2 ---

On dirait que vous ne faites pas cur.moveToFirst() avant de lire le curseur, de sorte que vous obtenez exceptiion. essayez de regarder android.database.CursorIndexOutOfBoundsException: Index -1 requested qui décrit le même problème.

- réponse Edité -

LookUpKey dans le code est pour un contact spécifique. L'exemple de conde que vous utilisez est d'obtenir la vcard pour un contact spécifique. vous devez boucler si les contacts disponibles et à l'intérieur vous pouvez mettre le code que vous avez pour le faire fonctionner. Vous pouvez obtenir la clé du contrat de contact.

En dehors de cela, vous devriez envisager de suivre une solution générale:

  1. S'il vous plaît ajouter une erreur que vous avez obtenu dans logcat
  2. Avez-vous ajouté l'autorisation de contact manifeste d'application pour permettre l'application à lire des contacts?
+0

Je cherche comment obtenir LOOKUPKEY dans Uri.withAppendedPath (ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); –

+0

Vous avez raison Je demande une clé de recherche en utilisant cur.getString (cur.getColumnIndex (Contacts.LOOKUP_KEY)); Comme mentionné ci-dessus mais son exception: android.database.CursorIndexOutOfBoundsException: Index -1 demandé, avec une taille de 2 , est-il quelque chose de mal dans le démarrage du code ContactComtract, s'il vous plaît expliquer. –

+0

avez-vous également consulté http://code.google.com/p/vcardio/ –

7

Vous êtes:

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(); 
    } 
} 
+0

Je reçois 'context ne peut pas être résolu' pour la ligne' fd = context.getContentResolver() '. – Dennis

+0

Le changer en 'fd = getContentResolver()' ne donne aucune erreur immédiate. – Dennis

+0

ce code ne fonctionne pas dans android 4.1 – Rohit

0
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()); 

} 
Questions connexes