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
Crear Proyecto JavaFX Maven
<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(); }
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()); } }
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
Proyecto en GitHub DriveFX
donde obtengo las librerías?
ResponderEliminarhttps://developers.google.com/api-client-library/java/google-api-java-client/download
Eliminar