Intent.ACTION_PICK возвращает пустой курсор для некоторых контактов

У меня есть приложение, в котором один аспект заключается в том, чтобы пользователь мог выбрать контакт и отправить текст этому контакту через приложение. Приложение работает только с некоторыми контактами и не работает с другими. Точнее:

для контактов, которые я ввел в свою книгу контактов вручную, Intent.ACTION_PICK без проблем находит и возвращает их в приложение, т. е. cursor.moveToFirst() верно.

Но для контакта, который был импортирован Facebook (мой телефон настроен на синхронизацию с контактами Facebook), я получаю следующее android.database.CursorIndexOutOfBoundsException после того, как нажимаю на контакт. У меня есть один вопиющий вопрос: почему размер результата равен 0 после того, как я буквально выбрал контакт? Почему cursor.moveToFirst() ложно?

...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

Вот мой код:

ОтправкаНамерение:

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:

(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 ...
        }

Примечание: я вижу контакты. Но после того, как я выбираю контакт, импортированный из Facebook, я получаю сбой.

Кстати: мой фрагмент кода точно скопирован из учебника по Android: http://developer.android.com/training/basics/intents/result.html


person Pouton Gerald    schedule 16.05.2013    source источник
comment
Обратите внимание, что для контактов Facebook cursor.moveToFirst() возвращает false. Я не просто заинтересован в бандаде, такой как ловля исключения. Я знаю, как проверить cursor.moveToFirst(). Мне нужно знать, как получить номера этих контактов.   -  person Pouton Gerald    schedule 19.05.2013
comment
Этот комментарий не имеет отношения к вашему вопросу... Поскольку вы используете проекцию, вам не нужно вызывать .getColumnIndex(...). Индекс столбца будет соответствовать индексу этого столбца в массиве строк проекции.   -  person abh    schedule 25.05.2013


Ответы (2)


Вы не можете получить доступ к контактам FB через API контактов.

person stoilkov    schedule 24.05.2013

Чтобы исправить сбой, вы должны проверить результат moveToFirst() следующим образом:

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

Чтобы изучить природу доступных вам данных, я бы передал «null» для проекции, чтобы все поля возвращались, и выводил имена и значения полей. Вы можете найти нужные данные, но не в поле НОМЕР.

person abh    schedule 25.05.2013