Search code examples
androidkotlingoogle-drive-apikotlin-coroutines

How to downlaod file from google drive and display in image in android


This is my following code.

I'm having a issue display image from Google Drive.

Source code from https://www.section.io/engineering-education/backup-services-with-google-drive-api-in-android/

I have also worked with this image url https://drive.google.com/uc?id=FILE_ID but only worked in anyone with the link access not restricted images.

fun downloadFileFromGDrive(id: String) {
    getDriveService()?.let { googleDriveService ->
        CoroutineScope(Dispatchers.IO).launch {

            val gDriveFile = googleDriveService.Files().get(id).execute()
            Log.e("gDriveFile", gDriveFile.toString())

           val outputStream: OutputStream = ByteArrayOutputStream()
            googleDriveService.files()[id].executeMediaAndDownloadTo(outputStream)

        }
    } ?: Toast.makeText(context, "Please Log In first!", LENGTH_SHORT).show()
}

Solution

  • Use the following function It will download Google drive Image and save it to the app private files folder.

     fun downloadFileFromGDrive(id: String) {
            getDriveService()?.let { googleDriveService ->
                CoroutineScope(Dispatchers.IO).launch {
                    Log.e("idDownload", id)
                    val file = File(context.filesDir, "${id}.jpg")
                    if (!file.exists()) {
                        try {
                            val gDriveFile = googleDriveService.Files().get(id).execute()
                            saveImageInFilesDir(gDriveFile.id)
                        } catch (e: Exception) {
                            println("!!! Handle Exception $e")
                        }
                    }
                }
            } ?: ""
        }
    
    
    private fun saveImageInFilesDir(id: String?) {
        getDriveService()?.let { googleDriveService ->
            CoroutineScope(Dispatchers.IO).launch {
                val file = File(context.filesDir, "${id}.jpg")
                try {
                    val outputStream = FileOutputStream(file)
                    googleDriveService.files()[id]
                        .executeMediaAndDownloadTo(outputStream)
                    if (id != null) {
                        googleDriveService.readFile(id)
                    }
               
                    outputStream.flush()
                    outputStream.close()
    
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        }
    
    }