2013-05-16 10 views
13

Ho un'app in cui un aspetto è che un utente seleziona un contatto e invia un testo a quel contatto attraverso l'app. L'app funziona solo con alcuni contatti e non funziona su altri. Più precisamente:Intent.ACTION_PICK restituisce il cursore vuoto per alcuni contatti

per i contatti che ho inserito manualmente nella mia rubrica, il Intent.ACTION_PICK non ha problemi a trovarli e restituirli all'app, ovvero cursor.moveToFirst() è vero.

Ma per il contatto importato da Facebook (il mio telefono è impostato per la sincronizzazione con i contatti di Facebook), dopo aver fatto clic sul contatto ottengo il seguente android.database.CursorIndexOutOfBoundsException. Una domanda lampante che ho è: perché la dimensione del risultato 0 dopo aver selezionato letteralmente un contatto? Perché è cursor.moveToFirst() falso?

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

Ecco il mio codice:

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); 

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

Nota: vedo i contatti. Ma dopo aver selezionato il contatto importato di Facebook, ottengo il crash.

BTW: Il mio frammento di codice viene copiato dal tutorial Android esattamente: http://developer.android.com/training/basics/intents/result.html

+0

Si noti che per i contatti di Facebook 'cursor.moveToFirst()' restituisce false. Non sono semplicemente interessato a un cerotto come catturare l'eccezione. So come controllare 'cursor.moveToFirst()'. Quello che devo sapere è come ottenere i numeri per quei contatti. –

+0

Questo commento non è correlato alla tua domanda ... Poiché stai utilizzando una proiezione, non è necessario chiamare .getColumnIndex (...). L'indice di colonna corrisponderà all'indice di quella colonna nell'array di stringhe di proiezione. – abh

risposta

2

Non è possibile accedere ai contatti FB tramite l'API dei contatti.

2

Per risolvere l'incidente si dovrebbe verificare il risultato di moveToFirst() in questo modo:

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

esplorare la natura dei dati che è a disposizione di voi sarei passato in "null" per la proiezione in modo che tutti i campi ritornino e che facciano uscire i nomi e i valori dei campi. Puoi trovare i dati che stai cercando, ma non nel campo NUMBER.