Upload progress listener not fired (Google drive A

2019-01-25 22:39发布

问题:

I want to show progress by percent of an uploading file using Google drive API.

My menthod has successful upload a file before but It can't see upload progress.

I've seen and added this FileUploadProgressListener but mediaHttpUploader.getProgress() show only 0.0 (start of progress) and 1.0 (when progress finished). I can't get percent of progress in time.

How to make It work?

Here is my Upload code:

public void UploadFile(final DFile uploadFile) {
    if (!isLoggedIn()) {
        OnUploadGoogleChecked(FALSE, "Not logged in");
        return;
    }
    AsyncTask<Void, Long, String> task = new AsyncTask<Void, Long, String>() {
        java.io.File fileContent;
        FileContent mediaContent;
        com.google.api.services.drive.model.File body;
        com.google.api.services.drive.model.File file;
        private ProgressDialog mDialog;
        long mFileLen;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            mDialog = new ProgressDialog(act);
            mDialog.setMax(100);
            mDialog.setMessage("Uploading ");
            mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mDialog.setProgress(0);
            mDialog.setButton("Cancel", new OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    // TODO Auto-generated method stub

                }
            });
            mDialog.show();
        }

        class FileUploadProgressListener implements MediaHttpUploaderProgressListener {

            @Override
            public void progressChanged(MediaHttpUploader uploader) throws IOException {
                Log.d("Dolphin got percent", String.valueOf(uploader.getProgress()));
                switch (uploader.getUploadState()) {
                case INITIATION_STARTED:
                    System.out.println("Initiation Started");
                    break;
                case INITIATION_COMPLETE:
                    System.out.println("Initiation Completed");
                    break;
                case MEDIA_IN_PROGRESS:
                    System.out.println("Upload in progress");
                    System.out.println("Upload percentage: " + uploader.getProgress());
                    break;
                case MEDIA_COMPLETE:
                    System.out.println("Upload Completed!");
                    break;
                case NOT_STARTED:
                    System.out.println("Upload Not Started!");
                    break;
                }
            }
        }

        @Override
        protected String doInBackground(Void... arg0) {
            try {

                java.io.File UPLOAD_FILE = new java.io.File(uploadFile.getNameAndDir());
                // File's metadata.
                fileContent = new java.io.File(uploadFile.getNameAndDir());
                mFileLen = fileContent.length();

                InputStreamContent mediaContent2 = new InputStreamContent("image/jpeg", new BufferedInputStream(new FileInputStream(UPLOAD_FILE)));
                mediaContent2.setLength(UPLOAD_FILE.length());
                body = new com.google.api.services.drive.model.File();
                body.setTitle(fileContent.getName());
                body.setMimeType("image/jpeg");
                String parentId = null;
                body.setParents(Arrays.asList(new ParentReference().setId(uploadFile.getFileHostFolderId())));


                Drive.Files.Insert mInsert = service.files().insert(body, mediaContent2);
                MediaHttpUploader uploader = mInsert.getMediaHttpUploader();
                uploader.setDirectUploadEnabled(true);
                uploader.setProgressListener(new FileUploadProgressListener());
                file = mInsert.execute();
                if (file != null) {

                }

            } catch (UserRecoverableAuthIOException e) {

                Log.d("Dolphin got error", "not login " + e);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }


        protected void onPostExecute(String result) {
            mDialog.dismiss();
            OnUploadGoogleChecked(TRUE, "Upload complete");
        };
    };
    task.execute();
}

回答1:

To get progress, you must use uploader.setDirectUploadEnabled(false); (instead of true) and uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE); or any value which must be the multiply of MediaHttpUploader.MINIMUM_CHUNK_SIZE, else it will cause error.