Android可恢复上传到Google云端硬盘

时间:2014-06-27 15:24:21

标签: android file-upload google-drive-api

我正在测试适用于Android的云端硬盘API上传一个可以显示已上传进度的文件,并且如果失败则可以恢复上传(文件大小> 30 MB。)

提出以下问题: Uploading Downloading of large size file to Google Drive giving errorUpload progress listener not fired (Google drive API) 我能够获得上传进度,他们提到这些是可恢复的上传。但是,我没有看到任何寻找上传错误和恢复逻辑的代码,因此如果我终止应用程序并“恢复”上传,它只是从头开始。

这是我的代码:

public class DriveScreen extends BaseDriveActivity {
    private Drive service;
    private Context context;
    @Override
    public void onConnected(Bundle connectionHint) {
        super.onConnected(connectionHint);
        context = this;

        //https://stackoverflow.com/questions/17429798/usingoauth2-deprecated
        GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE));
        credential.setSelectedAccountName("accountNameHERE");
        service = new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build();
        UploadFile();
    }

    public void UploadFile() {
        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(context);
                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("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());
                        mDialog.setProgress((int) (uploader.getProgress()*100));
                        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 {
                    File folder = Environment.getExternalStoragePublicDirectory(
                            Environment.DIRECTORY_PICTURES
                        );
                    File UPLOAD_FILE = new File(folder, "filePathHERE");
                    fileContent = new File(folder, "filePathHERE");
                    mFileLen = fileContent.length();

                    InputStreamContent mediaContent2 = new InputStreamContent("application/zip", new FileInputStream(UPLOAD_FILE));
                    mediaContent2.setLength(UPLOAD_FILE.length());
                    body = new com.google.api.services.drive.model.File();
                    body.setTitle(fileContent.getName());
                    body.setMimeType("application/zip");
                    //String parentId = null;
                    //int x = Files.List.setQ("mimeType = 'application/vnd.google-apps.folder' and title = 'ShareHim'");
                    //body.setParents(Arrays.asList(new ParentReference().setId(uploadFile.getFileHostFolderId())));



                    Files.Insert mInsert = service.files().insert(body, mediaContent2);
                    if(mFileLen > 5 * 1024 * 1024)
                    {
                        MediaHttpUploader uploader = mInsert.getMediaHttpUploader();
                        uploader.setDirectUploadEnabled(false);
                        uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE);
                        uploader.setProgressListener(new FileUploadProgressListener());
                        file = mInsert.execute();
                        if (file != null) {

                        }
                    }
                    else {
                        mInsert.execute();
                    }
                } catch (UserRecoverableAuthIOException e) {
                    System.out.println("login error");
                    Log.d("Error", "not login " + e);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }


            protected void onPostExecute(String result) {
                mDialog.dismiss();
            };
        };
        task.execute();
    }
}

现在,它是按块上传的,但是我们如何从最后发送的块恢复上传。在youtube上观看Google Drive会谈后,我的第一印象是可恢复上传是自动处理的,但似乎并非如此。

我接近这个错误的方式吗?是否值得考虑使用DriveSyncAdapter上传文件作为替代方案? (对不起代码不好,这只是一个测试)

1 个答案:

答案 0 :(得分:1)

看起来您正在使用Java REST-ful API。如果您使用特定于Android的API,则会全部为您处理。只需移交文件,API就会根据需要进行可恢复上传。见creating files.