Google ドライブ アカウントにフォルダがあり、特定のフォルダにファイルを追加したいと考えています。どうすればいいですか?例ではDriveId (EXISTING_FOLDER_ID) が必要でしたが、自分のフォルダーの DriveID がわかりません。名前しかわかりません。
4 に答える
わかった。Github のドライブ デモで同じ問題が発生しました: https://github.com/googledrive/android-demos
readme の一番下には、次のように書かれています。
実際にこのサンプル アプリを実行したい場合 (コードを読むことができるようにほとんど提供されていますが)、パッケージ com.google.android.gms.drive.sample.demo の OAuth 2.0 クライアントをデバッグ キーを所有し、リソース ID をアクセスできるものに設定します。リソース ID の定義は次のとおりです。
com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FOLDER_ID com.google.android.gms.drive.sample.demo.BaseDemoActivity.EXISTING_FILE_ID
彼らは、BaseDemoActivity ファイルで定義された EXISTING_FOLDER_ID および EXISTING_FILE_ID 定数の resourceID を正確に取得および設定する方法を実際に指定していませんでした。上記の seanpj のコメントを読んだ後、彼の方法番号 3 を使用して DriveID を見つけ、それを追加できるようにしました。デモアプリが正しく動作するようにします。
PC のドライブに移動し、上部にある [リンク] ボタンをクリックするだけです。
リンクの一部に「id=XXXXXXXXXXX」と記載されています。それをコピーして、デモ アプリの BaseDemoActivity ファイルに貼り付けます。ドライブで自分で作成したファイルとフォルダの両方に対してこれを行います。
デモ アプリが正常に実行されるはずです。
クエリを使用してフォルダーを見つけることができます
Query query = new Query.Builder().addFilter(Filters.and(
Filters.eq(SearchableField.TITLE, "folder name"),
Filters.eq(SearchableField.TRASHED, false))).build();
サンプルチュートリアル http://wiki.workassis.com/android-google-drive-api-deleted-folder-still-exists-in-query/を見つけ ました このチュートリアルでは、非同期的に呼び出しています
@スモーキーボブ。元の質問に役立つかどうかはわかりませんが、コメントごとに:
フォルダー/ファイルの DriveId を取得するコード スニペットを次に示します。「title」、「mime」、および「fldr」引数はオプションです。'fldr' にnullを渡すと、検索はグローバル (アプリの FILE スコープ内) で行われます。それ以外の場合は、指定されたフォルダー内 (サブフォルダーではありません) で行われます。これは、UI スレッドから実行する必要がある最も単純な「await()」フレーバーを使用します。
ただし、フォルダ/ファイル名は、Google ドライブ ユニバース内で一意のエンティティではないことに注意してください。1 つのフォルダに同じ名前の複数のファイル / フォルダを含めることができます。
GoogleApiClent _gac; // initialized elsewhere
//find files, folders. ANY 'null' ARGUMENT VALUE MEANS 'any'
public void findAll(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();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb != null) {
for (Metadata md : mdb) {
if (md == null) continue;
DriveId dId = md.getDriveId(); // here is the "Drive ID"
String title = md.getTitle();
String mime = md.getMimeType();
// ...
}
}
} finally { if (mdb != null) mdb.close(); }
}
}
一般的に、必要な「DriveId」は次の場所から取得できます。
- 上記のコードに示されているファイル/フォルダー名、または
- 「encodeToString()」から取得した文字列識別子。たとえば、MYROOTフォルダーIDをキャッシュするために使用します。
- 「getResourceId()」から取得した文字列識別子。これは、html アドレスに表示される文字列です。ただし、唯一のスコープは FILE であるため、それを使用してアプリが作成していないものを開くことを期待しないでください。
2 と 3 の識別子はどちらも文字列なので、混乱する可能性があります。(decodeFromString() を介して) ドライブ ID を取得する場合、識別子 2 の方が高速です。識別子 3 は (fetchDriveId() を介して) 取得するのが遅くなりますが、ID を別の場所 (Apps Script など) で取得する必要がある場合に役立ちます。SO 21800257も参照
ファイル/フォルダーの作成に関する限り、GitHub hereにいくつかのコードがあります。awaits\MainActivity.java ... buildTree() を見ると、単純なフォルダー ツリーを構築する際にフォルダー/ファイルが再帰的に作成されていることがわかります。
フォルダーのメタデータ (またはメタデータを取得できる DriveFolder オブジェクト) がある場合は、getDriveIdを呼び出すだけです。
Web リソースがある場合は、fetchDriveId を使用してそのリソース ID を使用して DriveId を取得できます。