unidad studio programacion para herramientas descargar desarrollo avanzado aplicaciones android sqlite android-intent contacts android-cursor

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.