Estoy usando Google Drive en mi aplicación. Puedo cargar datos en Google drive App folder y obtener la identificación del archivo. Mi pregunta es, cómo descargarlo de appDataFolder usando FileId Así es como obtengo los ID de archivo

     private List<String> getDataFromApi() throws IOException {

        List<String> fileInfo = new ArrayList<String>();
        FileList lst = mService.files().list()
                .setSpaces("appDataFolder")
                .execute();

        FileList result = mService.files().list()
                .setSpaces("appDataFolder")
                .setFields("nextPageToken, files(id, name, mimeType)")
                .execute();
        List<File> files = result.getFiles();
        if (files != null) {
            for (File file : files) {
                fileInfo.add(String.format("%s (%s) %s\n",
                        file.getName(), file.getId(), file.getMimeType()));
            }
        }
        return fileInfo;
    }

Estoy usando v3 de los servicios de Google Drive.

compile('com.google.apis:google-api-services-drive:v3-rev102-1.23.0') {
    exclude group: 'org.apache.httpcomponents'
}

Gracias de antemano

2
AMAN SINGH 17 feb. 2018 a las 08:17

2 respuestas

La mejor respuesta

Finalmente obtuve mi respuesta. Espero que esto ayude a otros también para descargar desde appDataFolder. Aquí estoy descargando y guardando el archivo en SD card nombre de carpeta Spectors. Y pasando el valor del tipo de archivo de com.google.api.services.api.drive.model.File.

       private void downloadFile(boolean useDirectDownload, File uploadedFile)
            throws IOException {


        java.io.File direct = new java.io.File(Environment.getExternalStorageDirectory()
                + "/Spectors");
        if (!direct.exists()) {
            direct.mkdirs();
        }

        java.io.File parentDir = new java.io.File(direct.getAbsolutePath());
        if (!parentDir.exists() && !parentDir.mkdirs()) {
            throw new IOException("Unable to create parent directory");
        }
        OutputStream out = new FileOutputStream(new java.io.File(parentDir, uploadedFile.getName()+".zip"));
        com.google.api.services.drive.Drive.Files.Get files = mService.files().get(uploadedFile.getId());
        files.executeMediaAndDownloadTo(out);

        Log.e(TAG, "downloadFile:2 " + files.toString() + "\n"+uploadedFile.getFileExtension() );
}
0
AMAN SINGH 17 feb. 2018 a las 09:57

También puede aplicar el siguiente enfoque para descargar el contenido de la carpeta de la aplicación

Obtener archivos de la carpeta de la aplicación con el siguiente código

private void listFiles() {
    Query query =
            new Query.Builder()
                    .addFilter(Filters.or(Filters.eq(SearchableField.MIME_TYPE, "text/html"),
                            Filters.eq(SearchableField.MIME_TYPE, "text/plain")))
                    .build();
    getDriveResourceClient()
            .query(query)

            .addOnSuccessListener(this,

                    new OnSuccessListener<MetadataBuffer>() {
                        @Override
                        public void onSuccess(MetadataBuffer metadataBuffer) {
                            //mResultsAdapter.append(metadataBuffer);

                            for (int i = 0; i <metadataBuffer.getCount() ; i++) {
                                retrieveContents(metadataBuffer.get(i).getDriveId().asDriveFile());
                            }
                        }
                    }

            )
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.e(TAG, "Error retrieving files", e);
                    MainActivity.this.finish();
                }
            });

}

Para descargar el contenido el siguiente código

 private void retrieveContents(DriveFile file) {
        // [START drive_android_open_file]
        Task<DriveContents> openFileTask =
                getDriveResourceClient().openFile(file, DriveFile.MODE_READ_ONLY);
        // [END drive_android_open_file]
        // [START drive_android_read_contents]
        openFileTask
                .continueWithTask(task -> {
                    DriveContents contents = task.getResult();
                    // Process contents...
                    // [START_EXCLUDE]
                    // [START drive_android_read_as_string]
                    try (BufferedReader reader = new BufferedReader(
                                 new InputStreamReader(contents.getInputStream()))) {
                        StringBuilder builder = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) {
                            builder.append(line).append("\n");
                        }
                        showMessage(getString(R.string.content_loaded));
                        mFileContents.setText(builder.toString());
                    }
                    // [END drive_android_read_as_string]
                    // [END_EXCLUDE]
                    // [START drive_android_discard_contents]
                    Task<Void> discardTask = getDriveResourceClient().discardContents(contents);
                    // [END drive_android_discard_contents]
                    return discardTask;
                })
                .addOnFailureListener(e -> {
                    // Handle failure
                    // [START_EXCLUDE]
                    Log.e(TAG, "Unable to read contents", e);
                    showMessage(getString(R.string.read_failed));
                    finish();
                    // [END_EXCLUDE]
                });
        // [END drive_android_read_contents]
    }
0
Chayon Ahmed 10 nov. 2018 a las 21:07