Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谷歌驱动Android API-检查文件夹是否存在_Android_Google Drive Api_Google Drive Android Api - Fatal编程技术网

谷歌驱动Android API-检查文件夹是否存在

谷歌驱动Android API-检查文件夹是否存在,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,我想知道如何使用新的 我尝试了以下方法,认为如果找不到文件夹,它会崩溃或返回null,但它不会这样做(只要它是有效的,即使文件夹已被删除) 如果我试图创建一个文件,即我从上述代码获得的文件夹,它也不会崩溃? 很明显,我很难理解这个新API是如何协同工作的,特别是在非常有限的教程和其他问题的情况下,我真的很难理解这个问题,所以任何输入都将不胜感激 只是为了澄清我的问题:我正在指定的Google Drive文件夹中创建一个文件,但如果该文件夹不存在(已被用户删除),我想先创建它 您可以尝试获取文件夹

我想知道如何使用新的

我尝试了以下方法,认为如果找不到文件夹,它会崩溃或返回null,但它不会这样做(只要它是有效的,即使文件夹已被删除)

如果我试图创建一个文件,即我从上述代码获得的文件夹,它也不会崩溃? 很明显,我很难理解这个新API是如何协同工作的,特别是在非常有限的教程和其他问题的情况下,我真的很难理解这个问题,所以任何输入都将不胜感激


只是为了澄清我的问题:我正在指定的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"