Skip to content

Most visited

Recently visited

navigation

Cómo enviar al usuario a otra app

Una de las características más importantes de Android es la capacidad que tienen las apps de enviar al usuario a otra app basándose en una “acción” que desea realizar. Por ejemplo, si tu app tiene la dirección de una empresa que deseas mostrar en un mapa, no necesitas crear una actividad para mostrar mapas en tu app. En cambio, puedes crear una solicitud para ver la dirección utilizando una Intent. Luego, el sistema Android inicia una app que puede mostrar la dirección en un mapa.

Como se explicó en la primera clase, Cómo crear tu primera app, debes utilizar intents para navegar entre las actividades en tu propia app. En general, debes utilizar una intent explícita, que define el nombre exacto de la clase de componente que deseas iniciar. Sin embargo, si deseas que otra app realice una acción, por ejemplo, “ver un mapa”, debes utilizar una intent implícita.

En esta lección, se muestra cómo crear una intent implícita para una acción determinada, y cómo utilizarla para iniciar una actividad que realice la acción en otra app.

Crear una intent implícita

Las intents implícitas no indican el nombre de clase del componente que se ha de iniciar, sino una acción que se ha de realizar. La acción especifica lo que deseas hacer, por ejemplo, ver, editar, enviar y obtener algo. Las intents generalmente también incluyen datos relacionados con la acción, como la dirección que deseas ver o el mensaje de correo electrónico que deseas enviar. Según la intent que deseas crear, los datos pueden ser un Uri, uno de varios tipos de datos diferentes, o quizá la intent no necesite ningún dato.

Si tu información es un Uri, existe un simple constructor Intent() que puedes usar para definir la acción y los datos.

Por ejemplo, a continuación se muestra la manera de crear una intent a fin de iniciar una llamada telefónica usando los datos de un Uri para especificar el número de teléfono:

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

Cuando tu app invoca esta intent llamando a startActivity(), la app de teléfono inicia una llamada al número de teléfono especificado.

A continuación, se muestran otras dos intents y tu acción y tus pares de datos Uri:

Otras clases de intents implícitas requieren datos “extra” que proporcionan diferentes tipos de datos, como una string. Puedes agregar uno o más datos adicionales usando los diferentes métodos putExtra().

De forma predeterminada, el sistema determina el tipo de MIME (extensiones multipropósito de correo de Internet) requerido por la intent sobre la base de los datos del Uri incluido. Si no incluye un Uri en la intent, generalmente debes utilizar un setType() para especificar el tipo de datos relacionados con la intent. Establecer el tipo de MIME también especifica qué clases de actividades deben recibir la intent.

A continuación, se incluyen otras intents que agregan datos extra para especificar la acción deseada:

Nota: Es importante que definas tu Intent de la forma más específica posible. Por ejemplo, si deseas mostrar una imagen usando la intent ACTION_VIEW, debes especificar un tipo de MIME image/*. Esto evita que las apps que pueden “ver” otros tipos de datos (como una aplicación de mapas) sean iniciadas por la intent.

Verificar que exista una app para recibir la intent

Si bien la plataforma Android garantiza que ciertas intents se podrán ejecutar con una de las apps incorporadas (como Teléfono, Correo electrónico o Calendario), siempre debes incluir un paso de verificación antes de invocar una intent.

Advertencia: Si invocas una intent y no hay una app disponible en el dispositivo que pueda manejar la intent, tu app fallará.

Para verificar que haya una actividad disponible que pueda responder a la intent, llama a queryIntentActivities() a fin de obtener una lista de actividades capaces de manejar tu Intent. Si el objeto List no está vacío, puedes usar la intent de forma segura. Por ejemplo:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

Si isIntentSafe es true, significa que al menos una app responderá a la intent. Si es false, significa que no existen apps para manejar la intent.

Nota: Debes realizar esta comprobación cuando tu actividad se inicia por primera vez, en caso de que necesites inhabilitar la función que utiliza la intent antes de que el usuario trate de utilizarla . Si conoces una app específica que puede manejar la intent, también puedes proporcionar un vínculo para que el usuario descargue la app (consulta el método para agregar un vínculo a tu producto en Google Play).

Iniciar una actividad con la intent

Figura 1: Ejemplo del diálogo de selección que aparece cuando más de una app puede controlar una intent.

Una vez que hayas creado tu Intent y establecido la información adicional, llama a startActivity() para enviarla al sistema. Si el sistema identifica más de una actividad que puede controlar la intent, muestra un diálogo para que el usuario seleccione la app que desea usar, como se muestra en la figura 1. Si hay solamente una actividad que maneja la intent, el sistema inmediatamente la inicia.

startActivity(intent);

A continuación, se incluye un ejemplo completo que muestra cómo crear una intent para ver un mapa, verificar que exista una app para manejar la intent y luego iniciarla:

// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe
if (isIntentSafe) {
    startActivity(mapIntent);
}

Mostrar un selector de apps

Figura 2: Diálogo de selección.

Ten presente que cuando inicias una actividad pasando tu Intent a startActivity() y existe más de una app que responde a la intent, el usuario puede seleccionar la app que se usará de forma predeterminada (seleccionando la casilla de verificación de la parte inferior del diálogo; consulta la figura 1). Esto es útil cuando se realiza una acción para la cual el usuario generalmente desea utilizar siempre la misma app, por ejemplo, al abrir una página web (los usuarios suelen utilizar un solo navegador) o tomar una fotografía (los usuarios suelen preferir una cámara).

Sin embargo, si la acción que se realizará puede controlarse a través de varias apps y es posible que el usuario prefiera usar una app diferente cada vez (como una acción de “compartir”, para la cual los usuarios pueden tener varias apps mediante las cuales deseen compartir un elemento), debes mostrar explícitamente un diálogo de selección como el de la figura 2. Este obliga al usuario a seleccionar la app que desea usar para la acción en cada ocasión (el usuario no puede seleccionar una app predeterminada para la acción).

Para mostrar el diálogo de selección, crea una Intent usando createChooser() y pásala a startActivity(). Por ejemplo:

Intent intent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

Aquí se muestra un diálogo con una lista de apps que responden a la intent pasada al método createChooser(), con el texto proporcionado como título del diálogo.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)