Drive API v3 Java/Android:共享文件无法通过list接口获取问题
Google Drive API 文件列表查询问题解决
问题背景
应用需求:从aUserFileCreator@gmail.com上传文件,设置公开可发现权限后分享给TheUserToListAndRead@gmail.com,目标是让该账户能通过API列出并读取这些共享文件。
上传及权限设置代码:
// 上传文件 File file = driveService.files() .create(fileMetadata, mediaContent) .setFields("id") .setSupportsAllDrives(true) .setIgnoreDefaultVisibility(true) .execute(); // 设置公开可读取权限 Permission p = new Permission(); p.setType("anyone"); p.setRole("reader"); p.setAllowFileDiscovery(true); driveService.permissions() .create(file.getId(), p) .execute(); // 分享给特定用户 Permission accessPermission = new Permission(); accessPermission.setEmailAddress("TheUserToListAndRead@gmail.com"); accessPermission.setType("user"); accessPermission.setRole("reader"); driveService.permissions().create(fileId, accessPermission).execute();
遇到的问题:使用以下代码查询时无返回结果,但文件在TheUserToListAndRead@gmail.com的Drive网页端可见;移除setQ或按MIME类型查询时,能正常读取该用户自身文件,改用setQ("sharedWithMe")也无效。
FileList result = driveService.files().list() .setQ("not 'me' in owners") .setIncludeItemsFromAllDrives(true) .setSupportsAllDrives(true) .setSpaces("drive,appDataFolder") .setCorpora("allDrives") .execute();
问题原因
spaces参数错误:appDataFolder是用户专属的私有应用数据空间,加入该值会过滤掉所有共享给用户的文件,仅保留私有应用数据,导致查询不到目标文件。corpora参数不匹配:allDrives主要用于查询包含共享驱动器(Team Drive)在内的所有驱动器内容,而用户接收的个人共享文件属于usercorpora的范畴,用allDrives会导致查询范围偏差。
修正后的代码方案
方案1:使用sharedWithMe查询共享文件
FileList result = driveService.files().list() .setQ("sharedWithMe") .setIncludeItemsFromAllDrives(true) .setSupportsAllDrives(true) .setSpaces("drive") // 仅查询常规Drive空间 .setCorpora("user") // 针对用户个人的共享内容 .execute();
方案2:使用not 'me' in owners查询非自有文件
FileList result = driveService.files().list() .setQ("not 'me' in owners") .setIncludeItemsFromAllDrives(true) .setSupportsAllDrives(true) .setSpaces("drive") .setCorpora("user") .execute();
额外说明
如果需要同时查询共享驱动器中的文件,可将corpora设为allDrives,并在Q参数中补充inSharedDrive=true筛选共享驱动器内容,示例:
FileList result = driveService.files().list() .setQ("sharedWithMe and inSharedDrive=true") .setIncludeItemsFromAllDrives(true) .setSupportsAllDrives(true) .setSpaces("drive") .setCorpora("allDrives") .execute();
内容的提问来源于stack exchange,提问作者mekanix
相关产品推荐
相关产品推荐

