Proveedor de contenido de Android para Gmail

La app de Gmail para Android incluye un proveedor de contenido que los desarrolladores externos pueden usar para recuperar información de etiquetas, como el nombre y el recuento de mensajes no leídos, y mantenerse actualizados a medida que cambia esa información. Por ejemplo, una app o un widget podría mostrar el recuento de mensajes no leídos de la bandeja de entrada de una cuenta específica.

Antes de usar este proveedor de contenido, llama al GmailContract.canReadLabels(Context) método para determinar si la versión de la app de Gmail del usuario admite estas consultas.

Cómo encontrar una cuenta de Gmail válida para consultar

Una app primero debe encontrar la dirección de correo electrónico de una cuenta de Gmail válida para consultar la información de la etiqueta. Con el GET_ACCOUNTS permiso, el AccountManager puede mostrar esta información:

// Get the account list, and pick the first one.
final String ACCOUNT_TYPE_GOOGLE = "com.google";
final String[] FEATURES_MAIL = {
        "service_mail"
};
AccountManager.get(this).getAccountsByTypeAndFeatures(ACCOUNT_TYPE_GOOGLE, FEATURES_MAIL,
        new AccountManagerCallback() {
            @Override
            public void run(AccountManagerFuture future) {
                Account[] accounts = null;
                try {
                    accounts = future.getResult();
                    if (accounts != null && accounts.length > 0) {
                        String selectedAccount = accounts[0].name;
                        queryLabels(selectedAccount);
                    }

                } catch (OperationCanceledException oce) {
                    // TODO: handle exception
                } catch (IOException ioe) {
                    // TODO: handle exception
                } catch (AuthenticatorException ae) {
                    // TODO: handle exception
                }
            }
        }, null /* handler */);

Cómo consultar el proveedor de contenido

Con una dirección de correo electrónico seleccionada, puedes obtener un ContentProvider URI para consultar. Proporcionamos una clase llamada GmailContract para construir el URI y definir las columnas que se muestran. Una app puede consultar este URI directamente.

Con los datos en el Cursor, puedes conservar el valor del URI en la GmailContract.Labels.URI columna para consultar y observar los cambios en una sola etiqueta.

El valor NAME de las etiquetas predefinidas puede variar según la configuración regional, por lo que no uses GmailContract.Labels.NAME. En su lugar, puedes identificar de forma programática las etiquetas predefinidas, como Recibidos, Enviados o Borradores, con el valor de cadena en la GmailContract.Labels.CANONICAL_NAME columna:

// Query for all labels and find the Inbox.
try (Cursor labelsCursor = getContentResolver().query(
        GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null)) {
    if (labelsCursor != null) {
        final String inboxCanonicalName = GmailContract.Labels.LabelCanonicalName.CANONICAL_NAME_INBOX;
        final int canonicalNameIndex = labelsCursor.getColumnIndexOrThrow(GmailContract.Labels.CANONICAL_NAME);
        while (labelsCursor.moveToNext()) {
            if (inboxCanonicalName.equals(labelsCursor.getString(canonicalNameIndex))) {
                // This row corresponds to the Inbox.
            }
        }
    }
}

Para obtener más información, consulta Conceptos básicos sobre proveedores de contenido.

Revisa un ejemplo

Para ver un ejemplo de este proveedor de contenido en acción, descarga una app de muestra.