获取 Google 云端硬盘中所有文件和文件夹的元数据
get metadata of all files and folders in Google Drive
我正在我的一个 Android 应用程序中实施 Google Drive。我可以验证。
在此方法中,我想列出所有文件和文件夹的元数据。
Drive.DriveApi.fetchDriveId(DemoUtil.getGoogleApiClient(), <drive_id>)
.setResultCallback(idCallback)
但这不起作用。它需要驱动器 ID,我将从哪里获得此驱动器 ID?
我可以获得 Google Drive 的所有文件和文件夹的元数据列表吗?
- 我正在使用 API 的播放服务。
首先,请注意,使用 GDAA ('API of play services') 只会为您提供 Android 应用程序创建的文件和文件夹,因为它仅支持'SCOPE_FILE' 范围。如果没问题,您可以使用这样的结构:
ArrayList<ContentValues> contvals = search(null, null, null);
...
private static GoogleApiClient mGAC;
/**************************************************
* find file/folder in GOODrive
* @param prnId parent ID (optional), null searches full drive, "root" searches Drive root
* @param titl file/folder name (optional)
* @param mime file/folder mime type (optional)
* @return arraylist of found objects
*/
static ArrayList<ContentValues> search(String prnId, String titl, String mime) {
ArrayList<ContentValues> gfs = new ArrayList<>();
if (mGAC != null && mGAC.isConnected()) try {
// 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
MetadataBufferResult rslt = Drive.DriveApi.query(mGAC, qry).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
for (Metadata md : mdb) {
if (md == null || !md.isDataValid() || md.isTrashed()) continue;
gfs.add(UT.newCVs(md.getTitle(), md.getDriveId().encodeToString()));
}
} finally { if (mdb != null) mdb.close(); }
}
} catch (Exception e) { }
return gfs;
}
只需修改您的 ContentValues contvals,以保存您想要的元数据。片段取自 this demo,您可以在其中找到未解析的上下文..
如果您需要所有 files/folders 而不管创建它们的应用程序如何,您必须使用 'DriveScopes.DRIVE' 范围的 REST API 和相同的代码片段看起来像这样:
ArrayList<ContentValues> contvals = search(null, null, null);
...
private static Drive mGOOSvc;
/***************************************************************************
* find file/folder in GOODrive
* @param prnId parent ID (optional), null searches full drive, "root" searches Drive root
* @param titl file/folder name (optional)
* @param mime file/folder mime type (optional)
* @return arraylist of found objects
*/
static ArrayList<ContentValues> search(String prnId, String titl, String mime) {
ArrayList<ContentValues> gfs = new ArrayList<>();
if (mGOOSvc != null && mConnected) try {
// add query conditions, build query
String qryClause = "'me' in owners and ";
if (prnId != null) qryClause += "'" + prnId + "' in parents and ";
if (titl != null) qryClause += "title = '" + titl + "' and ";
if (mime != null) qryClause += "mimeType = '" + mime + "' and ";
qryClause = qryClause.substring(0, qryClause.length() - " and ".length());
Drive.Files.List qry = mGOOSvc.files().list().setQ(qryClause)
.setFields("items(id,mimeType,labels/trashed,title),nextPageToken");
String npTok = null;
if (qry != null) do {
FileList gLst = qry.execute();
if (gLst != null) {
for (File gFl : gLst.getItems()) {
if (gFl.getLabels().getTrashed()) continue;
gfs.add( UT.newCVs(gFl.getTitle(),gFl.getId()));
} //else UT.lg("failed " + gFl.getTitle());
npTok = gLst.getNextPageToken();
qry.setPageToken(npTok);
}
} while (npTok != null && npTok.length() > 0); //UT.lg("found " + vlss.size());
} catch (Exception e) { UT.le(e); }
return gfs;
}
取自 here.
祝你好运。
我正在我的一个 Android 应用程序中实施 Google Drive。我可以验证。
在此方法中,我想列出所有文件和文件夹的元数据。
Drive.DriveApi.fetchDriveId(DemoUtil.getGoogleApiClient(), <drive_id>)
.setResultCallback(idCallback)
但这不起作用。它需要驱动器 ID,我将从哪里获得此驱动器 ID? 我可以获得 Google Drive 的所有文件和文件夹的元数据列表吗?
- 我正在使用 API 的播放服务。
首先,请注意,使用 GDAA ('API of play services') 只会为您提供 Android 应用程序创建的文件和文件夹,因为它仅支持'SCOPE_FILE' 范围。如果没问题,您可以使用这样的结构:
ArrayList<ContentValues> contvals = search(null, null, null);
...
private static GoogleApiClient mGAC;
/**************************************************
* find file/folder in GOODrive
* @param prnId parent ID (optional), null searches full drive, "root" searches Drive root
* @param titl file/folder name (optional)
* @param mime file/folder mime type (optional)
* @return arraylist of found objects
*/
static ArrayList<ContentValues> search(String prnId, String titl, String mime) {
ArrayList<ContentValues> gfs = new ArrayList<>();
if (mGAC != null && mGAC.isConnected()) try {
// 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
MetadataBufferResult rslt = Drive.DriveApi.query(mGAC, qry).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
for (Metadata md : mdb) {
if (md == null || !md.isDataValid() || md.isTrashed()) continue;
gfs.add(UT.newCVs(md.getTitle(), md.getDriveId().encodeToString()));
}
} finally { if (mdb != null) mdb.close(); }
}
} catch (Exception e) { }
return gfs;
}
只需修改您的 ContentValues contvals,以保存您想要的元数据。片段取自 this demo,您可以在其中找到未解析的上下文..
如果您需要所有 files/folders 而不管创建它们的应用程序如何,您必须使用 'DriveScopes.DRIVE' 范围的 REST API 和相同的代码片段看起来像这样:
ArrayList<ContentValues> contvals = search(null, null, null);
...
private static Drive mGOOSvc;
/***************************************************************************
* find file/folder in GOODrive
* @param prnId parent ID (optional), null searches full drive, "root" searches Drive root
* @param titl file/folder name (optional)
* @param mime file/folder mime type (optional)
* @return arraylist of found objects
*/
static ArrayList<ContentValues> search(String prnId, String titl, String mime) {
ArrayList<ContentValues> gfs = new ArrayList<>();
if (mGOOSvc != null && mConnected) try {
// add query conditions, build query
String qryClause = "'me' in owners and ";
if (prnId != null) qryClause += "'" + prnId + "' in parents and ";
if (titl != null) qryClause += "title = '" + titl + "' and ";
if (mime != null) qryClause += "mimeType = '" + mime + "' and ";
qryClause = qryClause.substring(0, qryClause.length() - " and ".length());
Drive.Files.List qry = mGOOSvc.files().list().setQ(qryClause)
.setFields("items(id,mimeType,labels/trashed,title),nextPageToken");
String npTok = null;
if (qry != null) do {
FileList gLst = qry.execute();
if (gLst != null) {
for (File gFl : gLst.getItems()) {
if (gFl.getLabels().getTrashed()) continue;
gfs.add( UT.newCVs(gFl.getTitle(),gFl.getId()));
} //else UT.lg("failed " + gFl.getTitle());
npTok = gLst.getNextPageToken();
qry.setPageToken(npTok);
}
} while (npTok != null && npTok.length() > 0); //UT.lg("found " + vlss.size());
} catch (Exception e) { UT.le(e); }
return gfs;
}
取自 here.
祝你好运。