X

Conseguir un Resultado de una Actividad

Iniciar otra actividad no es lo único que puedes hacer. También puedes iniciar una actividad y seguidamente obtener un resultado. Para recibir un resultado, utiliza startActivityForResult() (en lugar de startActivity()).

Por ejemplo, tu app puede iniciar una app para la cámara y recibir una foto capturada como resultado. O, puedes iniciar la app Contactos para seleccionar uno de ellos y recibir los detalles del contacto como resultado.

Por supuesto, la actividad que responda debe diseñarse para devolver un resultado. Cuando es el caso, se manda el resultado como otro objeto Intent. Tu actividad lo recibe mediante onActivityResult().

Nota: Puedes utilizar intenciones explícitas o implícitas cuando uses startActivityForResult(). Cuando inicies una de tus propias actividades para recibir un resultado, deberías utilizar una intención explícita para asegurar que recibas el resultado esperado.

Iniciar la Actividad

No hay nada nuevo relacionado con el objeto Intent que vas a usar cuando vayas a iniciar una actividad para obtener un resultado, solo necesitas pasar un argumento entero adicional al método startActivityForResult().

El argumento entero es un “código de solicitud” que identificará tu petición. Cuando recibas el resultado del Intent, se proporcionará el mismo código para que tu app pueda identificar el resultado y determinar como gestionarlo.

Por ejemplo, así puedes iniciar una actividad que permite al usuario seleccionar un contacto:

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    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);
}

Recibir el Resultado

Cuando el usuario ha terminado con la subsecuencia de actividad y resultados, el sistema llama al método de la actividad onActivityResult(). Este método incluye tres argumentos:

  1. El código que proporcionas a startActivityForResult().
  2. Un código de resultado especificado por la segunda actividad. Este puede ser RESULT_OK si la operación fue satisfactoria o RESULT_CANCELED si el usuario canceló la operación o ésta falló por alguna razón.
  3. Un Intent que incluye los datos con el resultado.

Por ejemplo, así puedes gestionar el resultado de la intención “seleccionar un contacto”:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

En este ejemplo, el resultado del Intent proporcionado por la app Contactos de Android proporciona un contenido Uri que identifica el contacto que el usuario ha seleccionado.

Para gestionar satisfactoriamente el resultado, debes saber en que formato estará el resultado del Intent. Es fácil saberlo cuando la actividad que devuelve un resultado es una de tus propias actividades. Las apps incluidas con la plataforma Android ofrecen sus propias APIs que te permiten conocer los datos específicos del resultado. Por ejemplo, la app Contactos siempre devuelve un resultado con el contenido URI que identifica al contacto seleccionado, la app Cámara devuelve un Bitmap en los “datos” extra (ver la lección Capturar Fotos).

Bonus: Leer los datos del contacto

El código de antes mostraba como conseguir el resultado de la app Contactos sin entrar en detalles sobre como actualmente se leen los datos del resultado, ya que se requiere de una formación más avanzada sobre los content providers. Sin embargo, si quieres curiosear, aquí tienes más código que muestra como consultar los datos para conseguir el número de teléfono del contacto seleccionado:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // 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 something with the phone number...
        }
    }
}

Nota: Antes de Android 2.3 (API 9), realizar una consulta con Contacts_Provider (como se muestra arriba) requiere que tu app declare el permiso READ_CONTACTS (ver Seguridad y Permisos). Sin embargo, a partir de Android 2.3, la app Contactos te garantiza un permiso de acceso temporal para leer el Contacts Provider que te lo devolverá como un resultado. Este permiso temporal se aplica solo a las peticiones de contacto específicas, así que no puedes consultar un otro contacto diferente al especificado mediante el Uri de la intención, a menos que declares el permiso READ_CONTACTS.

Puedes ver más información sobre Conseguir un Resultado de una Actividad en la página oficial de Google en inglés pulsando aquí.

Los comentarios de Disqus están cargando....