2

アプリケーションをドライブに接続したら、フォルダを作成しました。

今、そのフォルダー内に別のフォルダーを作成したいのですが、そのフォルダーがわかりませんDriveId

@Override
    public void onConnected(Bundle connectionHint) {
        Log.d("DEBUG", "Succesfully connected to Drive.");

        MetadataChangeSet metadata = new MetadataChangeSet.Builder()
                                            .setTitle(getResources().getString(R.string.app_name_short))
                                            .build();

        Drive.DriveApi.getRootFolder(mGoogleApiClient).createFolder(mGoogleApiClient, metadata);

        // Here I would like to retrieve the just created folder and create a subfolder in it

    }

どうすればそれを達成できますか?

さらに、上記のコードは接続ごとに新しいフォルダーを作成しているため、その名前のフォルダーが既に存在するかどうかを事前に確認したいと思います。また、Drive では同じ名前のフォルダを多数作成できるようです。

4

3 に答える 3

0

ResultCallback作成が完了したときにa が呼び出されるように設定し、ContentsResult渡された場所を取得します。

ドキュメントの例は次のとおりです。

public class CreateFileActivity {

    // ...

    ResultCallback<ContentsResult> contentsCallback = new
            ResultCallback<ContentsResult>() {
        @Override
        public void onResult(ContentsResult result) {
            if (!result.getStatus().isSuccess()) {
                // Handle error
                return;
            }

            MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                    .setTitle("New file")
                    .setMimeType("text/plain").build();
            // Create a file in the root folder
            Drive.DriveApi.getRootFolder(getGoogleApiClient())
                    .createFile(getGoogleApiClient(), changeSet, result.getContents())
                    .addResultCallback(this);
        }
    }
}
于 2014-05-06T17:30:11.603 に答える
0

これは、ソリューションの「待機」バージョンです (簡単にするために、非 UI スレッドで実行する必要があります) (GoogleApiClient の初期化/接続は標準であり、他の場所で見つけることができます)。

  static final String MIMEFLDR  = "application/vnd.google-apps.folder";
  private GoogleApiClient  _gac;

  DriveFolder myFldr = getOrCreateFldr(null, "myFolder");
  DriveFolder myChildFldr = getOrCreateFldr(myFldr, "myChildFolder");

  private DriveId findFirst(String title, String mime, DriveFolder fldr) {
    ArrayList<Filter> fltrs = new ArrayList<Filter>();
    fltrs.add(Filters.eq(SearchableField.TRASHED, false));
    if (title != null)  fltrs.add(Filters.eq(SearchableField.TITLE, title));
    if (mime  != null)  fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
    Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build(); 
    MetadataBufferResult rslt = (fldr == null) ? Drive.DriveApi.query(_gac, qry).await() : 
                                                   fldr.queryChildren(_gac, qry).await();
    MetadataBuffer mdb = null;
    if (rslt.getStatus().isSuccess()) try {
      mdb = rslt.getMetadataBuffer();
      for (Metadata md : mdb) {
        if ((md == null) || (!md.isDataValid()) || md.isTrashed()) continue;
        return md.getDriveId();
      }
    } catch (Exception e) {}
    finally { if (mdb != null) mdb.close(); } 
    return null;
  }

  private DriveFolder getOrCreateFldr(DriveFolder fldr, String titl) {
    DriveFolder df = null;
    try {
      DriveId dId = findFirst(titl, MIMEFLDR, fldr);
      if (dId != null) {                 // exists
        df = Drive.DriveApi.getFolder(_gac, dId);
      } else {                           // doesn't exist, create in folder / root
        df = createFldr((fldr == null) ? Drive.DriveApi.getRootFolder(_gac) : fldr,  titl);
      }
    } catch (Exception e) {UT.le(e);}
    return df;
  }

  private DriveFolder createFldr(DriveFolder fldr, String name) {
    DriveFolder drvFldr = null;
    try { 
      MetadataChangeSet meta = 
              new MetadataChangeSet.Builder().setTitle(name).setMimeType(MIMEFLDR).build();
      drvFldr = fldr.createFolder(_gac, meta).await().getDriveFolder();
    } catch (Exception e) {}
    return drvFldr;
  }

簡単にコールバック バージョンに変えることができますが、見栄えが悪くなります。ただし、findFirst() メソッドには注意してください。Google ドライブでは、複数のファイル / フォルダに同じ名前を付けることができます (ResourceId / DriveId のみが一意の識別子であるため)。

さらに深く掘り下げたい場合は、このGitHub プロジェクトに再帰的なフォルダーの作成が示されています。

于 2014-05-09T05:02:32.917 に答える
0

いくつかの回答を統合しようとしましたが、機能する方法を得るために自分の部分を追加しました。確かに、私が開発したこの方法よりもエレガントでカプセル化された方法があるでしょうが、それは私が今提供できる最高のものです.

メタデータからDriveIdオブジェクトを取得したら、次に asDriveFolder()メソッドを使用してDriveFolderオブジェクトを取得します。

How to get DriveId of created folder in Google Drive Android API に貢献してくれた @ Bikesh M Annurと @ seanpjに感謝します。

private DriveFolder mFolder;

private void getDriveFolder(String folderName) {

    Query query = new Query.Builder().addFilter(Filters.and(
            Filters.eq(SearchableField.TITLE, folderName),
            Filters.eq(SearchableField.TRASHED, false))).build();

    getDriveResourceClient().query(query).addOnSuccessListener(new OnSuccessListener<MetadataBuffer>() {
        @Override
        public void onSuccess(MetadataBuffer metadata) {
            mFolder = null;

            for (Metadata md : metadata) {
                if (md == null) continue;
                DriveId dId  = md.getDriveId();      // here is the "Drive ID"
                String title = md.getTitle();
                String mime  = md.getMimeType();

                if (md.isFolder()) {
                    mFolder = dId.asDriveFolder();   // Returns the "DriveFolder" object
                    break;
                }
            }

            if (mFolder != null) {
                // Or better from here you can take your actions
                //...
            }
        }
    });
}

注: Google ドライブでは、同じ名前のフォルダを複数作成できることに注意してください。このルーチンは、リストから最初のものを返します。すべての繰り返しのどれを取りたいかを検出するのはあなた次第です。

于 2018-02-15T01:05:58.790 に答える