JavaFX y Google Drive API

El servicio de almacenamiento en la nube Google Drive nos proporciona una API java que nos permite tener acceso a los servicios de Drive desde nuestra aplicación Java, aprenderemos a usar esta API para acceder mediante JavaFX a nuestros archivos almacenados en la nube, esta API también esta disponible para  otras plataformas como Python, .NET, Android, PHP  y otros.

Habilitar la API Google Drive


Como primer paso requerimos es crear nuestro proyecto y habilitar la API, lo hacemos a través de la consola de desarrolladores de Google, además necesitamos los permisos necesarios para acceder al servicio.

1) Vamos a Google Developers Console donde creamos nuestra aplicación, usamos la opción crear nuevo proyecto, continuar. 

2) Crear credenciales de acceso, en la misma ventana usamos el botón: Ir a las credenciales, luego Añadir credenciales, usaremos la opción: ID de cliente de OAuth 2.0.

3) Configurar pantalla de autorización: antes de proceder debemos por lo menos indicar el email y el nombre de nuestra aplicación, en esta sección configuramos la pantalla que se muestra al usuario para solicitar permiso de acceso, guardamos.

4) Indicar el tipo de aplicación, como crearemos una aplicación de escritorio JavaFX y la opción no esta disponible marcamos otro, damos un nombre y presionamos crear.

5) Descargamos el ID de cliente de OAuth 2.0 que acabamos de crear, lo llamaremos client_secret.json

client drive api

Crear Proyecto JavaFX Maven


Usando nuestro IDE favorito creamos un proyecto Maven, localizamos en archivo pom.xml para añadir las librerías necesarias.

        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>1.20.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>1.20.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-drive</artifactId>
            <version>v2-rev189-1.20.0</version>
        </dependency>
    


Copiamos el archivo client_secret.json descargado previamente en la carpeta de proyecto src/main/resources/

Para acceder a Google Drive debemos solicitar permiso, al cargar la aplicación por primera vez se abrirá una pagina en el navegador que tengamos por defecto, se le pide al usuario iniciar sesión y conceder permiso, esta operación genera el archivo StoredCredential usado para acceder posteriormente, si deseamos acceder a otra cuenta borramos el archivo, el mismo se encuentra en la ruta especificada por la constante DATA_STORE_DIR.


public static Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in = DriveFiles.class.getResourceAsStream("/client_secret.json");
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow.Builder(
                    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                    .setDataStoreFactory(DATA_STORE_FACTORY)
                    .setAccessType("offline")
                    .build();
    Credential credential = new AuthorizationCodeInstalledApp(
            flow, new LocalServerReceiver()).authorize("user");
    System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
    return credential;
}


La función getDriveService nos devuelve un objeto Drive autorizado para acceder a Google Drive, con el mismo podremos almacenar, modificar, eliminar, descargar archivos entre otras cosas.


public static Drive getDriveService() throws IOException {
    Credential credential = authorize();
    return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
}


google drive api javafx
Lo siguiente será pedir a Drive que nos proporcione todos los archivos o carpetas localizadas en un folder o carpeta, usamos el nombre clave “root” para referirnos al folder principal.

Este código nos devolverá una lista de objetos com.google.api.services.drive.model.File el mismo representa un archivo almacenado en Drive, nos interesa de momento su nombre el cual mostrara nuestra aplicación en un ListView y su ID.


private static List<File> listFilesInFolder(Drive service, String folderId) throws IOException {
    List<File> archivos = new ArrayList<>();
    Drive.Children.List request = service.children().list(folderId);
    try {
        ChildList children = request.execute();
        for (ChildReference child : children.getItems()) {
            File file = service.files().get(child.getId()).execute();
            archivos.add(file);
        }
    } catch (IOException e) {
        System.out.println("An error occurred: " + e);
        request.setPageToken(null);
    }


Para terminar modificaremos el cellFactory del ListView para que muestre el campo title del objeto File de modo que podamos ver el nombre de los archivos, agregamos también una acción al evento  MouseClicked de modo que navegamos dentro de la carpeta sobre la que hacemos doble clic.


listView.setCellFactory(param -> new TextFieldListCell<File>(
        new StringConverter<File>() {
            @Override
            public String toString(File object) {
                return object.getTitle();
            }
            @Override
            public File fromString(String string) {
                return null;
            }
        }
));
listView.setOnMouseClicked(event -> {
    if (event.getClickCount() == 2) {
        File file = listView.getSelectionModel().getSelectedItem();
        if (file != null) {
            explorarFolder(file.getId());
        }
    }


javafx accede a google drive
De momento nuestra aplicación JavaFX para explorar Google Drive tiene algunos inconvenientes, entre ellos: se muestran archivos que se encuentren en la papelera, no distingue entre carpetas y archivos, carece de navegación eficiente y puede ser lento al visualizar carpetas con gran cantidad de archivos, desde luego todo esto se puede mejorar pero lo haremos en otro tutorial pues este ya se hizo un poco extenso, nos vemos.

Proyecto en GitHub DriveFX

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Detección de figuras geométricas

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV