Downloads de mídia recuperáveis

Ao fazer o download de um arquivo de mídia grande de um servidor, use o download da mídia recuperável para fazer o download do arquivo bloco por bloco. As bibliotecas geradas pela API do Google contêm métodos de conveniência para interagir com o download de mídia recuperável.

O protocolo de download de mídia recuperável é semelhante ao protocolo de upload de mídia retomado, descrito na documentação da API Google Drive.

Detalhes da implementação

As principais classes de interesse são MediaHttpDownloader e MediaHttpDownloaderProgressListener. O download do conteúdo de mídia é feito em blocos, e o tamanho dele é configurável. Se um erro de servidor for encontrado em uma solicitação, essa solicitação será repetida.

Se os métodos nas bibliotecas geradas por serviços específicos forem compatíveis com o download no documento de descoberta, um método de download conveniente será criado para esses métodos que usam um OutputStream. Para saber mais sobre como usar o download de mídia com o serviço de descoberta de APIs do Google, consulte Download de mídia.

Exemplo:

class CustomProgressListener implements MediaHttpDownloaderProgressListener {
  public void progressChanged(MediaHttpDownloader downloader) {
    switch (downloader.getDownloadState()) {
      case MEDIA_IN_PROGRESS:
        System.out.println(downloader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Download is complete!");
    }
  }
}

OutputStream out = new FileOutputStream("/tmp/driveFile.jpg");

DriveFiles.Get request = drive.files().get(fileId);
request.getMediaHttpDownloader().setProgressListener(new CustomProgressListener());
request.executeMediaAndDownloadTo(out);

Também é possível usar esse recurso sem bibliotecas geradas específicas de serviços. Exemplo:

OutputStream out = new FileOutputStream("/tmp/Test.jpg");

MediaHttpDownloader downloader = new MediaHttpDownloader(transport, httpRequestInitializer);
downloader.setProgressListener(new CustomProgressListener());
downloader.download(requestUrl, out);

Download de mídia direto

O download de mídia retomada é ativado por padrão, mas é possível desativá-lo e usar o download de mídia direto, por exemplo, se você estiver fazendo o download de um arquivo pequeno. O download de mídia direta foi introduzido na versão 1.9.0-beta da Biblioteca de cliente da API do Google para Java.

O download de mídia direta faz o download de todo o conteúdo de mídia em uma solicitação HTTP, ao contrário do protocolo de download de mídia recuperável, que pode ser transferido por download em várias solicitações. Um download direto reduz o número de solicitações HTTP, mas aumenta a chance de falhas (como falhas de conexão) que podem acontecer com downloads grandes.

O uso é igual ao descrito acima, além da chamada a seguir, que instrui o MediaHttpDownloader a fazer downloads diretos:

mediaHttpDownloader.setDirectDownloadEnabled(true);