Mam aplikację, w której jeden aspekt jest dla użytkownika, aby wybrać kontakt i wysłać tekst do tego kontaktu za pośrednictwem aplikacji. Aplikacja działa tylko z niektórymi kontaktami i kończy się niepowodzeniem na innych. Dokładniej:Intent.ACTION_PICK zwraca pusty kursor dla niektórych kontaktów
dla kontaktów, które wprowadziłem do mojej książki kontaktów ręcznie, Intent.ACTION_PICK
nie ma problemu ze znalezieniem i zwróceniem ich do aplikacji, tj. cursor.moveToFirst()
jest prawdą.
Ale dla kontaktu, który został zaimportowany przez Facebooka (mój telefon jest skonfigurowany do synchronizowania z kontaktami z Facebooka), po kliknięciu kontaktu otrzymuje się następujący kod: android.database.CursorIndexOutOfBoundsException
. Mam jedno poważne pytanie: dlaczego rozmiar wyniku 0 po dosłownej selekcji kontaktu? Dlaczego cursor.moveToFirst()
jest fałszywe?
...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
Oto mój kod:
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 wynik:
(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 ...
}
Uwaga: Widzę kontakty. Ale po wybraniu Facebooka zaimportowałem kontakt, dostaję awarię.
BTW: Mam fragment kodu jest kopiowany z android samouczek dokładnie: http://developer.android.com/training/basics/intents/result.html
Należy pamiętać, że dla kontaktów Facebooka 'cursor.moveToFirst()' zwraca wartość false. Nie jestem tylko zainteresowany bandaidem, takim jak złapanie wyjątku. Wiem, jak sprawdzić 'cursor.moveToFirst()'. Muszę wiedzieć, jak uzyskać liczby dla tych kontaktów. –
Ten komentarz nie jest związany z twoim pytaniem ... Ponieważ używasz projekcji, nie musisz wywoływać .getColumnIndex (...). Indeks kolumny będzie odpowiadał indeksowi tej kolumny w tablicy ciągu projekcji. – abh