当前位置: 首页 > 知识库问答 >
问题:

Android可恢复上传至Google Drive

鲁淇
2023-03-14

我正在测试Android的驱动器API,以便上传一个文件,该文件可以显示上传的进度,并能够在失败时恢复上传(文件大小>30 MB)

与以下问题:上传下载的大文件到谷歌驱动器给错误,上传进度监听器没有激发(谷歌驱动器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();
    }
}

共有1个答案

欧阳衡
2023-03-14

看起来您使用的是Java REST-ful API。如果您使用特定于Android的API,这一切都是为您处理的。只要交出文件,API就会做适当的可恢复上传。请参见创建文件。

 类似资料:
  • 有人能告诉我如何在dropwizard 1.2.6中实现可恢复的文件上传吗?因此,如果用户试图上传一个大文件(4-5 GB),如果出现网络故障或浏览器错误关闭,那么用户将能够从中断的地方恢复该过程。

  • 使用 fetch 方法来上传文件相当容易。 连接断开后如何恢复上传?这里没有对此的内建选项,但是我们有实现它的一些方式。 对于大文件(如果我们可能需要恢复),可恢复的上传应该带有上传进度提示。由于 fetch 不允许跟踪上传进度,我们将会使用 XMLHttpRequest。 不太实用的进度事件 要恢复上传,我们需要知道在连接断开前已经上传了多少。 我们有 xhr.upload.onprogress

  • 我试图在vue js中构建镜像上传器,我希望它可以恢复上传,我从浏览器直接将请求发送到云存储服务器(例如,不使用php作为发送上传请求的中间件) 但是文档说我必须有访问令牌才能获取会话url,我稍后将使用它来上传图像,如何使用JavaScript获取此访问令牌,谷歌云没有javascript库,但在我不能用于浏览器使用的节点js中 邮递https://www.googleapis.com/uplo

  • 我试图通过删除“内部”恢复func来实现这一点,但在这种情况下,“主”恢复不能恢复“内部”goroutine内部的恐慌。 操场 我试图听从@momer的建议,通过通道发送错误并在主goroutine中处理它,而不是试图制造恐慌:

  • 我正在尝试使用Gmail的可恢复选项将附件上传到电子邮件。文件参考:https://developers.google.com/gmail/api/guides/uploads#resumable. 目前,我可以用可恢复的URI发送电子邮件,但没有附件(使用邮递员)。文档没有提供非常清楚的请求应该是什么样子的例子,在搜索互联网后,似乎也没有很多例子。 我的要求分为两部分: > 正文是64位编码字符

  • 问题内容: 首先,很抱歉,这是一个太愚蠢的问题……这是我第一次尝试使用此脚本中涉及的任何技术(Python,驱动器api,oauth 2.0等)。我发誓我一直在搜索并尝试这个问题大约一个星期,然后再发布问题。呵呵呵 我正在尝试使用google-api-python-client上传仅在终端机Linux Debian上的大文件(3.5GiB)。我已经成功上传了小文件,但是当我尝试上传大文件时,上传开