2015-11-24 3 views
0

Я пытаюсь загрузить любой тип файла на Google Drive с помощью goolge drive api. Я успешно загрузил текстовые файлы на Google Drive в корневую папку на Google Диске. Но я хочу создать папку на Google Диске, тогда я хочу загрузить файл под этой папкой. Я использовал ниже код, чтобы загрузить текстовый файл:Загрузка файлов с помощью google drive api в android

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

Если вы знаете, как получить MimeType, что проблема с хранением его в качестве переменной и использовать эту переменную вместо «текст/простой» в строке выше? – db579

ответ

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), или изменить ждать() s в setResultCallback() s (из here).

Good Luck

Смежные вопросы