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 las etiquetas, como el nombre y el recuento de mensajes no leídos, y mantenerse actualizado a medida que cambie 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 método GmailContract.canReadLabels(Context) para determinar si la versión de la app de Gmail del usuario admite estas consultas.

Buscar una cuenta de Gmail válida para realizar consultas

Una app primero debe encontrar la dirección de correo electrónico de una Cuenta de Gmail válida para buscar información sobre etiquetas. Con el permiso GET_ACCOUNTS, 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 realizar consultas al proveedor de contenido

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

Una app puede consultar este URI de forma directa o, mejor aún, usar un CursorLoader para obtener un cursor con información de todas las etiquetas de una cuenta:

Cursor labelsCursor = getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount), null, null, null, null);

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

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

// loop through the cursor and find the Inbox
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 ayuda, consulta Conceptos básicos sobre los proveedores de contenido

Revisar un ejemplo

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