谷歌驱动Android API-检查文件夹是否存在
我想知道如何使用新的 我尝试了以下方法,认为如果找不到文件夹,它会崩溃或返回null,但它不会这样做(只要它是有效的,即使文件夹已被删除) 如果我试图创建一个文件,即我从上述代码获得的文件夹,它也不会崩溃? 很明显,我很难理解这个新API是如何协同工作的,特别是在非常有限的教程和其他问题的情况下,我真的很难理解这个问题,所以任何输入都将不胜感激谷歌驱动Android API-检查文件夹是否存在,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,我想知道如何使用新的 我尝试了以下方法,认为如果找不到文件夹,它会崩溃或返回null,但它不会这样做(只要它是有效的,即使文件夹已被删除) 如果我试图创建一个文件,即我从上述代码获得的文件夹,它也不会崩溃? 很明显,我很难理解这个新API是如何协同工作的,特别是在非常有限的教程和其他问题的情况下,我真的很难理解这个问题,所以任何输入都将不胜感激 只是为了澄清我的问题:我正在指定的Google Drive文件夹中创建一个文件,但如果该文件夹不存在(已被用户删除),我想先创建它 您可以尝试获取文件夹
只是为了澄清我的问题:我正在指定的Google Drive文件夹中创建一个文件,但如果该文件夹不存在(已被用户删除),我想先创建它 您可以尝试获取文件夹的元数据。如果文件夹不存在,则此操作将失败。如果根据文件夹的存在状态创建文件夹,则会执行此操作 以下两个代码段根据传递的参数列出了文件/文件夹(在文件夹内,全局范围内,基于MIME类型…)。带有md.getTitle()的行可以用来查询文件/文件夹
GoogleApiClient _gac;
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) return null;
for (Metadata md : mdb) {
if ((md == null) || md.isTrashed()) continue;
--->>>> md.getTitle()
}
} finally { if (mdb != null) mdb.close(); }
}
}
void listAll(DriveFolder fldr) {
MetadataBufferResult rslt = fldr.listChildren(_gac).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb == null) return null;
for (Metadata md : mdb) {
if ((md == null) || md.isTrashed()) continue;
--->>>> md.getTitle()
}
} finally { if (mdb != null) mdb.close(); }
}
}
GoogleApiClient\u gac;
void findAll(字符串标题、字符串mime、驱动器文件夹fldr){
ArrayList fltrs=新的ArrayList();
添加(Filters.eq(SearchableField.TRASHED,false));
如果(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).wait();
if(rslt.getStatus().issucess()){
MetadataBuffer mdb=null;
试试{
mdb=rslt.getMetadataBuffer();
if(mdb==null)返回null;
for元数据(md:mdb){
如果((md==null)| | md.isTrashed())继续;
--->>>>格蒂特尔博士()
}
}最后{if(mdb!=null)mdb.close();}
}
}
作废列表全部(驱动器文件夹fldr){
MetadataBufferResult rslt=fldr.listChildren(_gac).await();
if(rslt.getStatus().issucess()){
MetadataBuffer mdb=null;
试试{
mdb=rslt.getMetadataBuffer();
if(mdb==null)返回null;
for元数据(md:mdb){
如果((md==null)| | md.isTrashed())继续;
--->>>>格蒂特尔博士()
}
}最后{if(mdb!=null)mdb.close();}
}
}
密钥可能正在检查“isTrashed()”状态。因为web上的“删除”文件只会将其移动到垃圾箱。另外,一般来说(在网站上)删除有点不可靠。我测试了一段时间,可能需要几个小时才能更新“isTrashed()”状态。手动清空谷歌硬盘中的垃圾也是不可靠的。看这个
有一点,但可能与您的问题无关。经过大量研究,这是我最终得到的代码。它工作正常,但有一个问题:当一个文件夹在Google Drive中被破坏时,我可以从我的应用程序中获取的元数据需要一些时间(小时)才能更新,这意味着该代码可以首先检测文件夹是否在数小时后被破坏——破坏事件实际发生——可以找到进一步的信息和讨论
公共类checkFolderActivity扩展了BaseDemoActivity{
@凌驾
未连接的公共无效(捆绑连接提示){
super.onConnected(connectionHint);
DriveId folderId=DriveId.decodeFromString(folderId);
DriveFolder folder=Drive.DriveApi.getFolder(mGoogleApiClient,folderId);
folder.getMetadata(mgoogleAppClient).setResultCallback(metadataRetrievedCallback);
}
最终私有结果Callback metadataRetrievedCallback=新建
ResultCallback(){
@凌驾
public void onResult(DriveResource.MetadataResult){
如果(!result.getStatus().issucess()){
Log.v(标记“尝试获取元数据时出现问题”);
返回;
}
Metadata Metadata=result.getMetadata();
if(metadata.isTrashed()){
Log.v(标记“文件夹被丢弃”);
}否则{
Log.v(标记“文件夹未被破坏”);
}
}
};
}
所以今天的API已经过时了。
因此,我发布了一个示例,说明如何使用以下新更新检查文件夹是否存在:
好主意!我会试试的,我希望它能起作用,但是运气不好。我能够读取所有早已消失的文件的元数据。就像被“空垃圾”扔掉甚至完全删除一样。就像10个小时前一样“早已逝去”。我猜web界面只是内部系统的另一个插件,存在一些延迟/同步问题。是的,我与@seanpjThanks确认了此处也报告的问题:。只是为了完整。顺便说一句,确保你用meatadata.close()关闭“metadata”缓冲区,如果我不这样做的话,我会得到资源泄漏。嗯,我没有找到这样的方法(metadata.close())-引用我也没有。但是ADT一直在唠叨资源泄漏,所以我键入了“metadata”。intellisense显示了.close()方法。所以我用了它,它不再抱怨了。但在关闭之前,必须复制/使用从缓冲区获取的所有“元数据”。Grep这里有“getMetadataBuffer”的内容:你会看到的。我记得在她的一个演示中向Burcu Dogan提出了这个问题,但我没有得到任何回应。哦,我很困惑,试图关闭元数据对象,这当然是不可能的。正如您所说,在元数据缓冲区上调用close()可以消除我也得到的资源泄漏。@Jakob传递给该方法DriveId folderId=DriveId.decodeFromString(folderId)的文件夹id是什么;该代码运行良好
GoogleApiClient _gac;
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) return null;
for (Metadata md : mdb) {
if ((md == null) || md.isTrashed()) continue;
--->>>> md.getTitle()
}
} finally { if (mdb != null) mdb.close(); }
}
}
void listAll(DriveFolder fldr) {
MetadataBufferResult rslt = fldr.listChildren(_gac).await();
if (rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb == null) return null;
for (Metadata md : mdb) {
if ((md == null) || md.isTrashed()) continue;
--->>>> md.getTitle()
}
} finally { if (mdb != null) mdb.close(); }
}
}
public class checkFolderActivity extends BaseDemoActivity {
@Override
public void onConnected(Bundle connectionHint) {
super.onConnected(connectionHint);
DriveId folderId = DriveId.decodeFromString(folderId);
DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, folderId);
folder.getMetadata(mGoogleApiClient).setResultCallback(metadataRetrievedCallback);
}
final private ResultCallback<DriveResource.MetadataResult> metadataRetrievedCallback = new
ResultCallback<DriveResource.MetadataResult>() {
@Override
public void onResult(DriveResource.MetadataResult result) {
if (!result.getStatus().isSuccess()) {
Log.v(TAG, "Problem while trying to fetch metadata.");
return;
}
Metadata metadata = result.getMetadata();
if(metadata.isTrashed()){
Log.v(TAG, "Folder is trashed");
}else{
Log.v(TAG, "Folder is not trashed");
}
}
};
}
fun checkFolder(name: String):Boolean {
check(googleDriveService != null) { "You have to init Google Drive Service first!" }
return search(name, FOLDER_MIME_TYPE)
}
private fun search(name: String, mimeType:String): Boolean {
var pageToken: String? = null
do {
val result: FileList =
googleDriveService!!
.files()
.list()
.setQ("mimeType='$FOLDER_MIME_TYPE'")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name)")
.setPageToken(pageToken)
.execute()
for (file in result.files) {
Log.d(TAG_UPLOAD_FILE , "Found file: %s (%s)\n ${file.name}, ${file.id} ")
if (name == file.name) return true
}
pageToken = result.nextPageToken
} while (pageToken != null)
return false
}
private const val FOLDER_MIME_TYPE= "application/vnd.google-apps.folder"