2017-02-02 289 views
0

我的應用有能力將角色表保存到Google雲端硬盤。它會在該用戶的Google Drive的根目錄下創建一個名爲「SWChars」的文件夾,然後將文件保存到該文件夾​​中。每個文件等於一個字符。當下面的內容運行時,它只能找到它創建的文件夾。如果你想要更多的情況下,你可以在GithubGoogle雲端硬盤無法找到文件夾或文件

找到完整的源代碼在GoogleApiClient的onConnected方法完成以下事項:

public static void connect(final Activity main){ 
    final DriveFolder root = Drive.DriveApi.getRootFolder(((SWrpg)main.getApplication()).gac); 
    root.queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder() 
      .addFilter(Filters.eq(SearchableField.TITLE,"SWChars")).build()) 
      .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
       @Override 
       public void onResult(@NonNull final DriveApi.MetadataBufferResult metBufRes) { 
        if(metBufRes.getStatus().isSuccess()){ 
         final MetadataBuffer metBuf = metBufRes.getMetadataBuffer(); 
         final DriveFolder[] charsFold = {null}; 
         System.out.println("Root List Size: "+String.valueOf(metBuf.getCount())); 
         for(Metadata met:metBuf){ 
          if(met.isFolder() && !met.isTrashed()){ 
           charsFold[0] = met.getDriveId().asDriveFolder(); 
           break; 
          } 
         } 
         metBuf.release(); 
         if(charsFold[0] ==null){ 
          System.out.println("Creating Chars Folder"); 
          root.createFolder(((SWrpg)main.getApplication()).gac, 
            new MetadataChangeSet.Builder().setTitle("SWChars").build()) 
            .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
             @Override 
             public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) { 
              if(driveFolderResult.getStatus().isSuccess()){ 
               charsFold[0] = driveFolderResult.getDriveFolder(); 
               charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder() 
                 .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build()) 
                 .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
                  @Override 
                  public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) { 
                   if(metadataBufferResult.getStatus().isSuccess()) { 
                    MetadataBuffer metBuffer = metadataBufferResult.getMetadataBuffer(); 
                    final DriveFolder[] shipFold = {null}; 
                    for (Metadata met:metBuffer){ 
                     if(met.isFolder()&&!met.isTrashed()){ 
                      shipFold[0] = met.getDriveId().asDriveFolder(); 
                      break; 
                     } 
                    } 
                    metBuf.release(); 
                    if(shipFold[0] ==null){ 
                     charsFold[0].createFolder(((SWrpg)main.getApplication()).gac, 
                       new MetadataChangeSet.Builder().setTitle("SWShips").build()) 
                       .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
                        @Override 
                        public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) { 
                         if(driveFolderResult.getStatus().isSuccess()){ 
                          shipFold[0] = driveFolderResult.getDriveFolder(); 
                          ((SWrpg)main.getApplication()).charsFold = charsFold[0]; 
                          ((SWrpg)main.getApplication()).vehicFold = shipFold[0]; 
                          System.out.println("Done"); 
                         } 
                        } 
                       }); 
                    } 
                   } 
                   metadataBufferResult.release(); 
                  } 
                 }); 
              } 
             } 
            }); 
         }else{ 
          charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder() 
            .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build()) 
            .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
             @Override 
             public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) { 
              if(metadataBufferResult.getStatus().isSuccess()){ 
               MetadataBuffer mets = metadataBufferResult.getMetadataBuffer(); 
               DriveFolder vehic = null; 
               for (Metadata met:mets){ 
                if(met.isFolder()&&!met.isTrashed()){ 
                 vehic = met.getDriveId().asDriveFolder(); 
                 break; 
                } 
               } 
               mets.release(); 
               if(vehic == null){ 
                charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,new MetadataChangeSet.Builder() 
                  .setTitle("SWShips").build()) 
                  .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
                   @Override 
                   public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) { 
                    if(driveFolderResult.getStatus().isSuccess()){ 
                     ((SWrpg)main.getApplication()).vehicFold = driveFolderResult.getDriveFolder(); 
                     ((SWrpg)main.getApplication()).charsFold = charsFold[0]; 
                    } 
                   } 
                  }); 
               }else{ 
                ((SWrpg)main.getApplication()).vehicFold = vehic; 
                ((SWrpg)main.getApplication()).charsFold = charsFold[0]; 
               } 
              } 
              metadataBufferResult.release(); 
             } 
            }); 
         } 
         metBufRes.release(); 
        } 
       } 
      }); 
} 

對不起,messyness。

回答

0

幾個小時瀏覽谷歌搜索我的問題的不同變化之後,我終於找到了答案:https://stackoverflow.com/a/27927026/7180534

,使得它工作在呼喚Drive.DriveApi.requestSync

主要的事情新代碼:

public static void connect(final Activity main){ 
    Drive.DriveApi.requestSync(((SWrpg)main.getApplication()).gac).setResultCallback(new ResultCallback<Status>() { 
     @Override 
     public void onResult(@NonNull Status status) { 
      if(status.isSuccess()){ 
       final DriveFolder root = Drive.DriveApi.getRootFolder(((SWrpg)main.getApplication()).gac); 
       root.queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder() 
         .addFilter(Filters.eq(SearchableField.TITLE,"SWChars")).setSortOrder(new SortOrder.Builder() 
           .addSortDescending(SortableField.MODIFIED_DATE).build()).build()) 
         .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
          @Override 
          public void onResult(@NonNull final DriveApi.MetadataBufferResult metBufRes) { 
           if(metBufRes.getStatus().isSuccess()){ 
            final MetadataBuffer metBuf = metBufRes.getMetadataBuffer(); 
            final DriveFolder[] charsFold = {null}; 
            for(Metadata met:metBuf){ 
             if(met.isFolder() && !met.isTrashed()){ 
              charsFold[0] = met.getDriveId().asDriveFolder(); 
              break; 
             } 
            } 
            metBuf.release(); 
            if(charsFold[0] ==null){ 
             root.createFolder(((SWrpg)main.getApplication()).gac, 
               new MetadataChangeSet.Builder().setTitle("SWChars").build()) 
               .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
                @Override 
                public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) { 
                 if(driveFolderResult.getStatus().isSuccess()){ 
                  charsFold[0] = driveFolderResult.getDriveFolder(); 
                  charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder() 
                    .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build()) 
                    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
                     @Override 
                     public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) { 
                      if(metadataBufferResult.getStatus().isSuccess()) { 
                       MetadataBuffer metBuffer = metadataBufferResult.getMetadataBuffer(); 
                       final DriveFolder[] shipFold = {null}; 
                       for (Metadata met:metBuffer){ 
                        if(met.isFolder()&&!met.isTrashed()){ 
                         shipFold[0] = met.getDriveId().asDriveFolder(); 
                         break; 
                        } 
                       } 
                       metBuf.release(); 
                       if(shipFold[0] ==null){ 
                        charsFold[0].createFolder(((SWrpg)main.getApplication()).gac, 
                          new MetadataChangeSet.Builder().setTitle("SWShips").build()) 
                          .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
                           @Override 
                           public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) { 
                            if(driveFolderResult.getStatus().isSuccess()){ 
                             shipFold[0] = driveFolderResult.getDriveFolder(); 
                             ((SWrpg)main.getApplication()).charsFold = charsFold[0]; 
                             ((SWrpg)main.getApplication()).vehicFold = shipFold[0]; 
                             System.out.println("Done"); 
                            } 
                           } 
                          }); 
                       } 
                      } 
                      metadataBufferResult.release(); 
                     } 
                    }); 
                 } 
                } 
               }); 
            }else{ 
             charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder() 
               .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build()) 
               .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() { 
                @Override 
                public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) { 
                 if(metadataBufferResult.getStatus().isSuccess()){ 
                  MetadataBuffer mets = metadataBufferResult.getMetadataBuffer(); 
                  DriveFolder vehic = null; 
                  for (Metadata met:mets){ 
                   if(met.isFolder()&&!met.isTrashed()){ 
                    vehic = met.getDriveId().asDriveFolder(); 
                    break; 
                   } 
                  } 
                  mets.release(); 
                  if(vehic == null){ 
                   charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,new MetadataChangeSet.Builder() 
                     .setTitle("SWShips").build()) 
                     .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() { 
                      @Override 
                      public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) { 
                       if(driveFolderResult.getStatus().isSuccess()){ 
                        ((SWrpg)main.getApplication()).vehicFold = driveFolderResult.getDriveFolder(); 
                        ((SWrpg)main.getApplication()).charsFold = charsFold[0]; 
                       } 
                      } 
                     }); 
                  }else{ 
                   ((SWrpg)main.getApplication()).vehicFold = vehic; 
                   ((SWrpg)main.getApplication()).charsFold = charsFold[0]; 
                  } 
                 } 
                 metadataBufferResult.release(); 
                } 
               }); 
            } 
            metBufRes.release(); 
           } 
          } 
         }); 
      } 
     } 
    }); 
} 
0

您可能需要使用DriveFolder.listChildren這將提供直接孩子的上市爲使用谷歌雲端硬盤Android API中working with folders討論

此外,在Querying for Files

可以使用com.google.android.gms.drive.query包搜索用戶的雲端硬盤帳戶的元數據符合您的搜索條件的文件。您可以針對特定文件夾或整個文件系統發出查詢。

但是,請注意這一點:

Android的驅動API只能用https://www.googleapis.com/auth/drive.file範圍工作。這意味着只有用戶使用應用程序打開或創建的文件才能與查詢匹配。

+0

我曾嘗試listChildren之前具有相同的效果。我找到了我的問題的答案,但謝謝! –

相關問題