Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在我的android应用程序中显示上传到Google Drive的进度?_Java_Android_Google Drive Api - Fatal编程技术网

Java 如何在我的android应用程序中显示上传到Google Drive的进度?

Java 如何在我的android应用程序中显示上传到Google Drive的进度?,java,android,google-drive-api,Java,Android,Google Drive Api,我有以下代码 这应该是从我的安卓设备上传图像到我的谷歌硬盘 private void saveFileToDrive() { progressDialog = ProgressDialog.show(this, "", "Loading..."); Thread t = new Thread(new Runnable() { @Override public void run() { try { // Fil

我有以下代码

这应该是从我的安卓设备上传图像到我的谷歌硬盘

  private void saveFileToDrive() {

      progressDialog = ProgressDialog.show(this, "", "Loading...");

    Thread t = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          // File's binary content
          java.io.File fileContent = new java.io.File(fileUri.getPath());
          FileContent mediaContent = new FileContent("image/jpeg", fileContent);

          // File's metadata.
          File body = new File();
          body.setTitle(fileContent.getName());
          body.setMimeType("image/jpeg");

          File file = service.files().insert(body, mediaContent).execute();
          if (file != null) {
            showToast("Photo uploaded: " + file.getTitle());

            progressDialog.dismiss();
            //startCameraIntent();
          }
        } catch (UserRecoverableAuthIOException e) {
          startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    });
    t.start();
  }
问题是上传永远不会结束。这很奇怪,因为图像不太大

我想如果我能通过原始的驱动程序上传,速度会更快

1) 如何显示上传进度


2) 上传完成后,如何在同一活动中进行回调?

从Google Drive下载文件:

  • 您可以使用AsyncTask,在该任务中,您可以从url获取inputstream,并编写一个while循环,用于读取每一行并在对话框上显示下载的数据,如下所示

    @Override
    protected Boolean doInBackground(FilesObject... files) {
    // getting an input Stream.
    HttpResponse resp = service.getRequestFactory()
            .buildGetRequest(new GenericUrl(file.SourceImageUrl)).execute();
    fileSize = resp.getHeaders().getContentLength();
    if (fileSize != -1) {
        fileSizeReadableString = DiskSpaceUtil.readableFileSize(fileSize);
    }
    InputStream is = resp.getContent();
    
    // publishing the progress in a dialog.
    int completed = 0;
    while ((length = inputStream.read(buffer)) > 0) {
        if (!this.isCancelled()) {
            completed += length;
            fOutputStream.write(buffer, 0, length);
            publishProgress(completed);
        } else {
            fOutputStream.flush();
            fOutputStream.close();
            inputStream.close();
            return;
        }
    }
    
    @Override
    protected void onProgressUpdate(Integer... values) {
    
        sendShowloader("Downloading file ... \n"
                + DiskSpaceUtil.readableFileSize(number) + " of "
                + fileSizeReadableString);
    
    }
    
  • 您可以使用固有的GoogleDrive下载侦听器,该侦听器可以使用insert对象进行设置

  • 正在将文件上载到Google Drive:

    我们可以使用google自己的MediaHttpUploaderProgressListener实现将文件上载到google drive,如下所示:

        { // ... Inside some thread
    
        java.io.File fil = new java.io.File(file.SourceImageUrl);
        InputStream is = new FileInputStream(fil);
    
        InputStreamContent mediaContent = new InputStreamContent(file.mimeType, is);
                mediaContent.setLength(fil.length());
    
        // File's metadata.
        File body = new File();
        body.setTitle(file.FileTitle);
        body.setMimeType(file.mimeType);
        body.setParents(parents);
        body.setDescription("Content Uploaded to "+ DriveName);
        // Inserting the Remote Resource into Google Drive
        File destFile = null;
    
        if(fil.length() > 5 * 1024 * 1024)
        {
            // Resumable Uploads when the file size exceeds a file size of 5 MB.
            // check link : 
            // 1) https://code.google.com/p/google-api-java-client/source/browse/drive-cmdline-sample/src/main/java/com/google/api/services/samples/drive/cmdline/DriveSample.java?repo=samples&r=08555cd2a27be66dc97505e15c60853f47d84b5a
            // 2) http://stackoverflow.com/questions/15970423/uploading-downloading-of-large-size-file-to-google-drive-giving-error
    
            Insert insert = mService.files().insert(body, mediaContent);
            MediaHttpUploader uploader = insert.getMediaHttpUploader();
            uploader.setDirectUploadEnabled(false);
            uploader.setProgressListener(new FileUploadProgressListener());
            destFile = insert.execute();
    
        }   
        else
        {
            // Else we go by Non Resumable Uploads, which is safe for small uploads.
            destFile = mService.files().insert(body, mediaContent).execute();
        }
    
        ... }
    
        // Now the implementation of FileUploadProgressListener which extends MediaHttpUploaderProgressListener
    
    public static class FileUploadProgressListener implements MediaHttpUploaderProgressListener {
    
        public void progressChanged(MediaHttpUploader uploader) throws IOException {
          switch (uploader.getUploadState()) {
            case INITIATION_STARTED:
              postToDialog("Initiation Started");
              break;
            case INITIATION_COMPLETE:
              postToDialog("Initiation Completed");
              break;
            case MEDIA_IN_PROGRESS:
              // postToDialog("Upload in progress");
              postToDialog("Upload percentage: " + uploader.getProgress());
              break;
            case MEDIA_COMPLETE:
              postToDialog("Upload Completed!");
              break;
    
            case NOT_STARTED :
                postToDialog("Not Started!");
                break;
          }
        }
      }
    

    您是否尝试过使用
    AsyncTask
    ?这是否正在启动另一个线程?service.files().insert(body,mediaContent.execute()@艾曼纽,我试试看。关于(1)有什么想法吗?@mario我不这么认为。但是整个代码都在一个新的线程中,我已经更新了我的答案,正如您在可恢复上传块中看到的那样。insert方法的uploader设置为not Direct Uploades(非直接上载),这意味着他们现在将使用可恢复上载将文件插入到google drive,可恢复上载是使用insert方法内的代码完成的,如中所述,整个实现在insert api内管理!您可以使用Eclipse的JD插件查看google客户端libs的源代码,其中所有代码都在内部汇总。:)@SriKrishna,,由于我在导入和解析驱动器文件时非常困惑,请提供显示依赖关系的完整代码,插入api:(。请帮助这是多路径上载吗?