У меня есть приложение, в котором один аспект предназначен для того, чтобы пользователь мог выбрать контакт и отправить текст этому контакту через приложение. Приложение работает только с некоторыми контактами и не работает на других. Точнее:
для контактов, которые я вошел в мою контактную книгу вручную, Intent.ACTION_PICK
не имеет проблем с поиском и возвратом их в приложение, т.е. cursor.moveToFirst()
является истинным.
Но для контакта, который был импортирован Facebook (мой телефон настроен на синхронизацию с контактами Facebook), я получаю следующий android.database.CursorIndexOutOfBoundsException
после того, как я нажимаю на контакт. Один вопиющий вопрос, который у меня есть, заключается в следующем: почему размер результата 0 после того, как я буквально выбрал контакт? Почему cursor.moveToFirst()
false?
...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
Вот мой код:
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 result:
(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 only one result for the given URI)
// CAUTION: The query() method should be called from a separate thread to avoid blocking
// your app 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, я получаю сбой.
BTW: мой фрагмент кода скопирован из учебника android точно: http://developer.android.com/training/basics/intents/result.html