Intention.Action PICK renvoie le curseur vide pour certains contacts

j'ai une application dans laquelle l'un des aspects est pour un utilisateur de sélectionner un contact et envoyer un sms au contact via l'application. L'application ne fonctionne qu'avec certains contacts et échoue sur les autres. Plus précisément:

pour les contacts que j'ai entrés dans mon carnet de contact à la main, le Intent.ACTION_PICK n'a aucune difficulté à les retrouver et à les renvoyer vers l'application, c.-à-d. cursor.moveToFirst() est vraie.

mais pour le contact qui a été importé par Facebook (mon téléphone est réglé pour se synchroniser avec les contacts Facebook), Je reçois le suivant android.database.CursorIndexOutOfBoundsException après avoir cliqué sur le contact. Une question que j'ai est la suivante: Pourquoi le résultat est-il de taille 0 après que j'ai littéralement sélectionné un contact? Pourquoi est cursor.moveToFirst() faux?

...Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
05-15 17:57:04.741: E/AndroidRuntime(21301):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)
05-15 17:57:04.741: E/AndroidRuntime(21301):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
05-15 17:57:04.741: E/AndroidRuntime(21301):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
05-15 17:57:04.741: E/AndroidRuntime(21301):    at android.database.CursorWrapper.getString(CursorWrapper.java:114)
05-15 17:57:04.741: E/AndroidRuntime(21301):    at com.company.Game.SendTextActivity.onActivityResult(SendTextActivity.java:118)
05-15 17:57:04.741: E/AndroidRuntime(21301):    at android.app.Activity.dispatchActivityResult(Activity.java:5436)
05-15 17:57:04.741: E/AndroidRuntime(21301):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3188)
05-15 17:57:04.741: E/AndroidRuntime(21301):    ... 11 more

Voici mon code:

dispatchIntent:

Intent pickContactIntent = new Intent(Intent.ACTION_PICK,  Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

onActivity résultat:

(requestCode == PICK_CONTACT_REQUEST) {
            // Get the URI that points to the selected contact
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            String[] projection = { Phone.NUMBER };

            // Perform the query on the contact to get the NUMBER column
            // We don't need a selection or sort order (there's only one result for the given URI)
            // CAUTION: The query() method should be called from a separate thread to avoid blocking
            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
            // Consider using CursorLoader to perform the query.
            Cursor cursor = getContentResolver()
                .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Retrieve the phone number from the NUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            //do work with number here ...
        }

Note: je vois les contacts. Mais après avoir sélectionné le contact importé de Facebook, j'obtiens le crash.

BTW: mon code snippet est copié du tutoriel android exactement: http://developer.android.com/training/basics/intents/result.html

13
demandé sur Pouton Gerald 2013-05-16 05:16:05

2 réponses

vous ne pouvez pas accéder aux contacts FB Via L'API Contacts.

2
répondu stoilkov 2013-05-24 17:15:07

Pour corriger le crash, vous devriez vérifier le résultat de moveToFirst() comme ceci:

String number = null;
if (cursor.moveToFirst()) {
   number = cursor.getString(0); // 0 matches the index of NUMBER in your projection.
}

pour explorer la nature des données qui sont disponibles pour vous je passerais dans "null" pour la projection de sorte que tous les champs reviennent, et dump les noms de champ et les valeurs. Vous pouvez trouver les données que vous recherchez, mais pas dans le champ Nombre.

2
répondu abh 2013-05-25 05:04:02