android - studio - Intent.ACTION_PICK devuelve el cursor vacío para algunos contactos
manual de programacion android (2)
Tengo una aplicación en la que un aspecto es que un usuario seleccione un contacto y envíe un texto a ese contacto a través de la aplicación. La aplicación solo funciona con algunos contactos y falla en otros. Más precisamente:
para los contactos que Intent.ACTION_PICK
en mi libro de contactos a mano, Intent.ACTION_PICK
no tiene problemas para encontrarlos y devolverlos a la aplicación, es decir, cursor.moveToFirst()
es verdadero.
Pero para el contacto que fue importado por Facebook (mi teléfono está configurado para sincronizar con los contactos de Facebook), obtengo la siguiente android.database.CursorIndexOutOfBoundsException
luego de hacer clic en el contacto. Una pregunta evidente que tengo es: ¿por qué es el tamaño de resultado 0 después de que, literalmente, seleccioné un contacto? ¿Por qué 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
Aquí está mi código:
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);
Resultado de la actividad:
(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: veo los contactos. Pero después de seleccionar el contacto importado de Facebook, obtengo el bloqueo.
Por cierto: mi fragmento de código se copia exactamente del tutorial de Android: http://developer.android.com/training/basics/intents/result.html
No puede acceder a los contactos de FB a través de la API de Contactos.
Para solucionar el bloqueo, debe verificar el resultado de moveToFirst () de esta manera:
String number = null;
if (cursor.moveToFirst()) {
number = cursor.getString(0); // 0 matches the index of NUMBER in your projection.
}
Para explorar la naturaleza de los datos que están disponibles para usted pasaría "nulo" para la proyección, de modo que todos los campos vuelvan, y vuelque los nombres y valores de los campos. Puede encontrar los datos que está buscando, pero no en el campo NÚMERO.