我正在尝试使用以下代码列出Google云端硬盘帐户的根目录。
不幸的是,它只显示 1个文件,这是一个由我的应用创建和删除的文件。我在根文件夹中有多个文件,这些文件已存在数月,因此它们应该可见(我在我的应用程序上使用相同的帐户登录)。
这是我正在使用的代码:
// Get currently signed in account (or null)
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount( this );
// Synchronously check for necessary permissions
if( ! GoogleSignIn.hasPermissions( account, Drive.SCOPE_FILE ) )
{
// Note: this launches a sign-in flow, however the code to detect the result of the sign-in flow and retry the API call is not shown here.
GoogleSignIn.requestPermissions( this, RC_DRIVE_PERMS, account, Drive.SCOPE_FILE );
return;
}
client = Drive.getDriveResourceClient( this, account );
// Start task - to get the root folder and contents..
rootFolderTask = client.getRootFolder();
Tasks.whenAll( rootFolderTask ).continueWithTask( new Continuation<Void, Task<MetadataBuffer> >()
{
@Override
public Task<MetadataBuffer> then( @NonNull Task<Void> task ) throws Exception
{
DriveFolder parent = rootFolderTask.getResult();
listChildrenTask = client.listChildren( parent );
return listChildrenTask;
}
} )
.addOnSuccessListener( this,
new OnSuccessListener<MetadataBuffer>()
{
@Override
public void onSuccess( MetadataBuffer list )
{
Log.i( TAG, "Got child list Success(A)" );
int nNumItems = list.getCount();
Log.i( TAG, "Got " + nNumItems + " items" );
for( int i = 0; i < nNumItems; i ++ )
{
Metadata md = list.get( i );
Log.i( TAG, i + " getDriveId: " + md.getDriveId() );
Log.i( TAG, i + " getTitle: " + md.getTitle() );
Log.i( TAG, i + " isFolder: " + md.isFolder() );
Log.i( TAG, i + " isTrashed: " + md.isTrashed() );
Log.i( TAG, i + " getFileSize: " + md.getFileSize() );
Log.i( TAG, i + " getFileExtension: " + md.getFileExtension() );
}
//showMessage( getString( R.string.file_created,
// driveFile.getDriveId().encodeToString() ) );
//finish();
list.release();
}
} )
我的Logcat输出:
01-05 14:27:24.150 17248-17248/org.libsdl.app I/PDS: Got child list Success(A)
01-05 14:27:24.150 17248-17248/org.libsdl.app I/PDS: Got 1 items
01-05 14:27:24.155 17248-17248/org.libsdl.app I/PDS: 0 getDriveId: DriveId:CAESITFwaGZ2TDhYM2UwWndpRXJ2elRwSG41Z3VWOFRqQW8zXxh-IPyMkcvdUigA
01-05 14:27:24.155 17248-17248/org.libsdl.app I/PDS: 0 getTitle: abhaytest2
01-05 14:27:24.155 17248-17248/org.libsdl.app I/PDS: 0 isFolder: false
01-05 14:27:24.155 17248-17248/org.libsdl.app I/PDS: 0 isTrashed: true
01-05 14:27:24.155 17248-17248/org.libsdl.app I/PDS: 0 getFileSize: 12
01-05 14:27:24.155 17248-17248/org.libsdl.app I/PDS: 0 getFileExtension:
我承认我不熟悉Tasks
,Continutation
,continueWithTask
和addOnSuccessListener
。
为什么我没有看到列出的其他文件?
在检索完所有文件后调用addOnSuccessListener()
,还是仅在第一次调用时调用continueWith
(即我应该使用continueWith
代替吗?)
更新:如果我使用addOnSuccessListener
代替getAppFolder()
,我会得到相同的结果。
更新:唉! Google API文档说明查询文件的以下内容:
注意:Android Drive API仅适用于https://www.googleapis.com/auth/drive.file范围。这意味着只有用户使用您的应用程序打开或创建的文件才能通过查询进行匹配。
和..
“使用'drive.file'访问用户驱动器的范围。此范围允许每个文件访问由应用程序创建或专门打开的文件。” < / p>
看起来好像我的应用程序可能不允许打开它自己没有创建的文件?当然这不是真的 - 这将阻止我使用可以共享文件的Windows应用程序和Android移动应用程序。
也许我应该使用'app'文件夹? (例如Person
)
但是 - 我无法使用'app'文件夹,因为Google声明:
“应用程序文件夹是Drive中的一个特殊文件夹,只能由您的应用程序访问。其内容对用户和其他应用程序是隐藏的。虽然它对用户隐藏,但app文件夹确实不计用户的云端硬盘存储空间配额。“
必须有办法创建一个应用程序和用户都可以看到的共享文件夹吗?也许Google Drive无法(目前)用于在Windows和Android应用之间共享文件 - 也许我需要使用DropBox或其他东西?
我的Google云端硬盘有打开 - >&gt;连接更多应用菜单选项。这似乎让用户选择哪个应用可以查看文件夹/文件。
如何连接开发/调试应用程序,以便在尚未在Play商店中发布时查看文件夹的内容?
答案 0 :(得分:1)
您的帖子中有多个问题,但简短的回答是您可以查看未使用该应用创建的文件。问题是用户必须选择允许的文件。您可以使用newOpenFileActivityIntentSender让用户选择他们授权访问的文件。
有一个长期存在的功能请求允许在文件夹级别进行授权,但到目前为止还没有实现该功能。
当然,您可以始终使用具有完整驱动器范围的REST API。出于安全原因,不建议使用完整范围 - 应用很少需要访问用户拥有的所有文件。您还会放弃Android版API的一些更好的功能(例如离线支持)