Android API Google Диска onChildrenRetrievedCallback

Я создаю приложение и пытаюсь просмотреть PDF-файл, хранящийся в общей папке Google Диска, в приложении. Я уже подключился к Диску, и у меня уже настроен GoogleApiClient. Прямо сейчас я запрашиваю базу данных и пытаюсь обработать результаты, но у меня проблемы с этим кодом:

Query query = new Query.Builder().addFilter(Filters.and(
                        Filters.eq(SearchableField.TITLE, "sample_pdf.pdf"),
                        Filters.eq(SearchableField.MIME_TYPE, "application/vnd.google-apps.file")))
                .build();
Drive.DriveApi.query(googleApiClient, query)
        .setResultCallback(new OnChildrenRetrievedCallback() {

    @Override
    public void onChildrenRetrieved(MetadataBufferResult result) {
        // Iterate over the matching Metadata instances in mdResultSet
    }
});

Android Studio не может разрешить класс OnChildrenRetrievedCallback. Я импортировал пакет com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks, но не знаю, что еще здесь делать. Любая помощь?


person Datz    schedule 14.08.2015    source источник


Ответы (1)


Попробуй это:

/********************************************************************
   * find file/folder in GOODrive
   * @param prnId   parent ID (optional), null searches full drive, "root" searches Drive root
   *                this is a String representation of DriveId (DriveId.encodeToString() 
   * @param titl    file/folder name (optional)
   * @param mime    file/folder mime type (optional)
   * @return        void (arraylist of found objects in callback)
   */
  static void find(String prnId, String titl, String mime) {

    // add query conditions, build query
    ArrayList<Filter> fltrs = new ArrayList<>();
    if (prnId != null){
      fltrs.add(Filters.in(SearchableField.PARENTS,
        prnId.equalsIgnoreCase("root") ?
          Drive.DriveApi.getRootFolder(mGAC).getDriveId() : DriveId.decodeFromString(prnId)));
    }
    if (titl != null) fltrs.add(Filters.eq(SearchableField.TITLE, titl));
    if (mime != null) fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
    Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build();

    // fire the query
    Drive.DriveApi.query(mGAC, qry).setResultCallback(new ResultCallback<MetadataBufferResult>() {
      @Override
      public void onResult(MetadataBufferResult rslt) {
        if (rslt.getStatus().isSuccess()) {
          MetadataBuffer mdb = null;
          try {
            mdb = rslt.getMetadataBuffer();
            for (Metadata md : mdb) {
              if (md == null || !md.isDataValid() || md.isTrashed()) continue;
              // collect files
              DriveId driveId = md.getDriveId();
              String dId = driveId.encodeToString();
              String mime = md.getMimeType();
              //.....
            }
          } finally { if (mdb != null) mdb.close(); }  // don't know if necessary
        }
      }
    });
  }

Ваш фильтр mimeType тоже выглядит неправильно. Я предлагаю пропустить фильтр mimeType, выполнить поиск только по имени (названию) и дважды проверить тип mime, который вы получаете (md.getMimeType() в приведенном выше коде).

ОСТЕРЕГАТЬСЯ! Имя/название файла НЕ ЯВЛЯЕТСЯ УНИКАЛЬНЫМ ИДЕНТИФИКАТОРОМ во вселенной GooDrive

ЕЩЕ ОДИН ОСТОРОЖНО! Вы не увидите файл, если он не был создан вашим Android-приложением (см. СФЕРЫ ПОДДЕРЖКИ GDAA).

Удачи

person seanpj    schedule 14.08.2015