Android 如何使用RESTAPI获取从google drive下载的文件的进度?

Android 如何使用RESTAPI获取从google drive下载的文件的进度?,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,我正在用谷歌硬盘下载一个文件 我的代码: ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); driveService.files().export(remoteFiles[0].getId(),"text/plain").executeMediaAndDownloadTo(byteArrayOutputStream); FileOutputStr

我正在用谷歌硬盘下载一个文件

我的代码:

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        driveService.files().export(remoteFiles[0].getId(),"text/plain").executeMediaAndDownloadTo(byteArrayOutputStream);


        FileOutputStream fileOutputStream= new FileOutputStream(new File(downloadsDirectory,remoteFiles[0].getName()));


        byteArrayOutputStream.writeTo(fileOutputStream);

        byteArrayOutputStream.flush();

        byteArrayOutputStream.close();
        fileOutputStream.close();

有没有办法获得文件下载的进度?

我能想到的第一件事是将FileOutputStream包装在自定义流中,该自定义流覆盖write方法,以额外通知侦听器写入的字节数。像这样:

public class ProgressOutputStream extends OutputStream {
    IProgressListener _listener;
    OutputStream _stream;
    int _position;

    public ProgressOutputStream(OutputStream stream, IProgressListener listener) {
        _stream = stream;
        _listener = listener;
    }

    @Override
    public void write(byte[] b, int offset, int len) {
        _stream.write(b, offset, len);
        _position += len;
        reportProgress();
    }

    private void reportProgress() {
        _listener.onProgressUpdate(_position);
    }

    @Override
    public void write(int b) {
        _stream.write(b);
    }
}

interface IProgressListener {
    void onProgressUpdate(int progress);
}

剩下的就是要知道文件的大小,这样你就可以在你的进度监听器中计算进度百分比。

回答我自己的问题,找到了


这是怎么回事?我正在调用ByteArrayOutputStream.writeTo()方法。我应该扩展ByteArrayOutputStream吗?@Guest1997:-“将此字节数组输出流的完整内容写入指定的输出流参数,就像使用out.write(buf,0,count)调用输出流的write方法一样。”我尝试了这一点,进度在0处停留了一段时间,然后突然从0跳到100%。我认为现在的情况是,这种方法测量的是对磁盘的写入,而不是实际的下载。我认为数据被下载到问题片段第2行的ByteArrayPutStream,然后可能将ByteArray stream@guest1997包装起来。谢谢你的回答,顺便问一下,你如何定义:setChunkSize(1000000)?当我这么做的时候,速度下降了很多,我得到了“java.net.SocketTimeoutException:timeout”,这可能是什么原因呢?很奇怪为什么有一个侦听器时速度下降了这么多,但是改变超时解决了问题
//custom listener for download progress
class DownloadProgressListener implements MediaHttpDownloaderProgressListener{


    @Override
    public void progressChanged(MediaHttpDownloader downloader) throws IOException {
        switch (downloader.getDownloadState()){

            //Called when file is still downloading
            //ONLY CALLED AFTER A CHUNK HAS DOWNLOADED,SO SET APPROPRIATE CHUNK SIZE
            case MEDIA_IN_PROGRESS:
                //Add code for showing progress
                break;
            //Called after download is complete
            case MEDIA_COMPLETE:
                //Add code for download completion
                break;
         }
    }
}


//create a Drive.Files.Get object,
//set a ProgressListener
//change chunksize(default chunksize seems absurdly high)
Drive.Files.Get request = driveService.files().get(remoteFiles[0].getId());
request.getMediaHttpDownloader().setProgressListener(new DownloadProgressListener()).setChunkSize(1000000);
request.executeMediaAndDownloadTo(outputStream);