2013-05-16 17 views
13

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

+0

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

+0

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

Odpowiedz

2

nie można uzyskać dostępu kontakty FB poprzez styki API.

2

Aby naprawić awarię należy sprawdzić wynik moveToFirst() tak:

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

Aby zbadać charakter danych, które są dostępne dla Ciebie Chciałbym przekazać w „null” dla projekcji tak wszystkie pola powrócą i zrzuć nazwy pól i wartości. Możesz znaleźć dane, których szukasz, ale nie w polu NUMBER.

Powiązane problemy