2017-02-02 3 views
0

Мое приложение имеет возможность сохранять листы персонажей на Google Диске. Он создает папку с именем «SWChars» в корневом каталоге Google Диска, а затем сохраняет файлы в папке. Каждый файл равен одному символу. Когда ниже выполняется, он находит только найденные папки. Если вы хотите немного больше контекста вы можете найти полный исходный код на GithubGoogle Диск не может найти папку или файлы

делается на onConnected методе GoogleApiClient в следующем:

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

Через несколько часов просмотра Google для поиска различных вариантов моего вопроса, я наконец-то нашел ответ: 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, который обеспечит перечисление прямых детей, как описано в working with folders с помощью Google Drive Android API

Кроме того, в Querying for Files,

Вы можете использовать com.google.android.gms.drive.query пакет для поиска учетная запись пользователя для файлов, метаданные которых соответствуют вашим критериям поиска. Вы можете отправить запрос для определенной папки или всей файловой системы.

Однако, обратите внимание на следующее:

API-интерфейс Android Drive работает только с https://www.googleapis.com/auth/drive.file области. Это означает, что только файлы, которые пользователь открыл или создал с вашим приложением, могут быть сопоставлены запросом.

+0

Я раньше пробовал список детей с таким же эффектом. Я нашел ответ на свой вопрос, но спасибо! –

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