在android中使用google drive api上传文件

时间:2015-11-24 07:28:01

标签: android google-drive-android-api

我正在尝试使用goolge驱动器api将任何类型的文件上传到google驱动器。 我已成功将文本文件上传到谷歌驱动器到谷歌驱动器的根文件夹。 但我想创建一个文件夹到谷歌驱动器然后我想上传我的文件在这个文件夹下。 我使用下面的代码上传文本文件:

    public void run() {
                OutputStream outputStream = driveContents.getOutputStream();
                addTextfileToOutputStream(outputStream);
                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                        .setTitle(uploadFileName)
                        .setMimeType("text/plain")
                        .setDescription(
                                "")
                        .setStarred(true).build();

                Drive.DriveApi
                        .getRootFolder(googleApiClient)             
                        .createFile(googleApiClient, changeSet,
                                driveContents)
                        .setResultCallback(fileCallback);
            }

现在如何创建文件夹,然后将我的文件上传到此文件夹?

有没有人有任何解决方案?

1 个答案:

答案 0 :(得分:1)

创建一个文件夹,然后使用该文件夹创建一个文件作为其父文件。

  private static GoogleApiClient mGAC;
  //...

  /*********************************************************************
   * create file/folder in GOODrive
   * @param parentFolder parent folder, null for root
   * @param titl folder name
   * @return folder object
   */
  static DriveFolder createFolder(DriveFolder parentFolder, String titl) {
    DriveId dId = null;
    if (mGAC != null && mGAC.isConnected() && titl != null) try {
      if (parentFolder == null)
        parentFolder =  Drive.DriveApi.getRootFolder(mGAC);
      if (parentFolder == null) return null; //----------------->>>

      MetadataChangeSet meta;
      meta = new Builder().setTitle(titl)
                        .setMimeType("application/vnd.google-apps.folder").build();
      DriveFolderResult r1 = parentFolder.createFolder(mGAC, meta).await();
      DriveFolder dFld =
        (r1 != null) && r1.getStatus().isSuccess() ? r1.getDriveFolder() : null;
      if (dFld != null) {
        MetadataResult r2 = dFld.getMetadata(mGAC).await();
        if ((r2 != null) && r2.getStatus().isSuccess()) {
          dId = r2.getMetadata().getDriveId();
        }
      }
    } catch (Exception e) { e.printStackTrace(); }
    return dId == null ? null : dId.asDriveFolder();
  }
  /********************************************************************
   * create file in GOODrive
   * @param pFldr parent's ID, null for root
   * @param titl  file name
   * @param mime  file mime type
   * @param file  file (with content) to create
   * @return file object
   */
  static DriveFile createFile(DriveFolder pFldr, String titl, String mime, File file) {
    DriveId dId = null;
    if (mGAC != null && mGAC.isConnected() && titl != null && mime != null && file != null) try {
      if (pFldr == null)
        pFldr =  Drive.DriveApi.getRootFolder(mGAC);
      if (pFldr == null) return null; //----------------->>>

      DriveContents cont = file2Cont(null, file);
      MetadataChangeSet meta = new Builder().setTitle(titl).setMimeType(mime).build();
      DriveFileResult r1 = pFldr.createFile(mGAC, meta, cont).await();
      DriveFile dFil = r1 != null && r1.getStatus().isSuccess() ? r1.getDriveFile() : null;
      if (dFil != null) {
        MetadataResult r2 = dFil.getMetadata(mGAC).await();
        if (r2 != null && r2.getStatus().isSuccess()) {
          dId = r2.getMetadata().getDriveId();
        }
      }
    } catch (Exception e) { e.printStackTrace(); }
    return dId == null ? null : dId.asDriveFile();
  }

  private static DriveContents file2Cont(DriveContents cont, File file) {
    if (file == null) return null;  //--------------------->>>
    if (cont == null) {
      DriveContentsResult r1 = Drive.DriveApi.newDriveContents(mGAC).await();
      cont = r1 != null && r1.getStatus().isSuccess() ? r1.getDriveContents() : null;
    }
    if (cont != null) try {
      OutputStream oos = cont.getOutputStream();
      if (oos != null) try {
        InputStream is = new FileInputStream(file);
        byte[] buf = new byte[4096];
        int c;
        while ((c = is.read(buf, 0, buf.length)) > 0) {
          oos.write(buf, 0, c);
          oos.flush();
        }
      }
      finally { oos.close();}
      return cont; //++++++++++++++++++++++++++++++>>>
    } catch (Exception ignore)  {}
    return null;   //--------------------->>>
  }

您需要在非UI线程(AsyncTask)中运行它,或将 await()s 更改为 setResultCallback()s (取自here)。

祝你好运