Google 驱动器找不到文件夹或文件

Google Drive can't find folder or files

我的应用程序能够将角色 sheet 保存到 Google 驱动器。它会在该人的 Google 驱动器的根目录上创建一个名为 "SWChars" 的文件夹,然后将文件保存在该文件夹中。每个文件等于一个字符。当下面是 运行 时,它只会找到它创建的文件夹。如果您需要更多上下文,可以在 Github

找到完整的源代码

以下是在 GoogleApiClient 的 onConnected 方法上完成的:

public static void connect(final Activity main){
    final DriveFolder root = Drive.DriveApi.getRootFolder(((SWrpg)main.getApplication()).gac);
    root.queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
            .addFilter(Filters.eq(SearchableField.TITLE,"SWChars")).build())
            .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                @Override
                public void onResult(@NonNull final DriveApi.MetadataBufferResult metBufRes) {
                    if(metBufRes.getStatus().isSuccess()){
                        final MetadataBuffer metBuf = metBufRes.getMetadataBuffer();
                        final DriveFolder[] charsFold = {null};
                        System.out.println("Root List Size: "+String.valueOf(metBuf.getCount()));
                        for(Metadata met:metBuf){
                            if(met.isFolder() && !met.isTrashed()){
                                charsFold[0] = met.getDriveId().asDriveFolder();
                                break;
                            }
                        }
                        metBuf.release();
                        if(charsFold[0] ==null){
                            System.out.println("Creating Chars Folder");
                            root.createFolder(((SWrpg)main.getApplication()).gac,
                                    new MetadataChangeSet.Builder().setTitle("SWChars").build())
                                    .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                        @Override
                                        public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                            if(driveFolderResult.getStatus().isSuccess()){
                                                charsFold[0] = driveFolderResult.getDriveFolder();
                                                charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                                        .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                                        .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                                            @Override
                                                            public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                                                if(metadataBufferResult.getStatus().isSuccess()) {
                                                                    MetadataBuffer metBuffer = metadataBufferResult.getMetadataBuffer();
                                                                    final DriveFolder[] shipFold = {null};
                                                                    for (Metadata met:metBuffer){
                                                                        if(met.isFolder()&&!met.isTrashed()){
                                                                            shipFold[0] = met.getDriveId().asDriveFolder();
                                                                            break;
                                                                        }
                                                                    }
                                                                    metBuf.release();
                                                                    if(shipFold[0] ==null){
                                                                        charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,
                                                                                new MetadataChangeSet.Builder().setTitle("SWShips").build())
                                                                                .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                                    @Override
                                                                                    public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                                        if(driveFolderResult.getStatus().isSuccess()){
                                                                                            shipFold[0] = driveFolderResult.getDriveFolder();
                                                                                            ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                                            ((SWrpg)main.getApplication()).vehicFold = shipFold[0];
                                                                                            System.out.println("Done");
                                                                                        }
                                                                                    }
                                                                                });
                                                                    }
                                                                }
                                                                metadataBufferResult.release();
                                                            }
                                                        });
                                            }
                                        }
                                    });
                        }else{
                            charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                    .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                        @Override
                                        public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                            if(metadataBufferResult.getStatus().isSuccess()){
                                                MetadataBuffer mets = metadataBufferResult.getMetadataBuffer();
                                                DriveFolder vehic = null;
                                                for (Metadata met:mets){
                                                    if(met.isFolder()&&!met.isTrashed()){
                                                        vehic = met.getDriveId().asDriveFolder();
                                                        break;
                                                    }
                                                }
                                                mets.release();
                                                if(vehic == null){
                                                    charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,new MetadataChangeSet.Builder()
                                                            .setTitle("SWShips").build())
                                                            .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                @Override
                                                                public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                    if(driveFolderResult.getStatus().isSuccess()){
                                                                        ((SWrpg)main.getApplication()).vehicFold = driveFolderResult.getDriveFolder();
                                                                        ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                    }
                                                                }
                                                            });
                                                }else{
                                                    ((SWrpg)main.getApplication()).vehicFold = vehic;
                                                    ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                }
                                            }
                                            metadataBufferResult.release();
                                        }
                                    });
                        }
                        metBufRes.release();
                    }
                }
            });
}

抱歉打扰了。

您可能想使用 DriveFolder.listChildren which will provide the listing of direct children as discussed in working with folders 使用 Google 驱动器 Android API

此外,在Querying for Files

You can use the com.google.android.gms.drive.query package to search a user's Drive account for files whose metadata match your search criteria. You can issue a query for a specific folder or on the entire filesystem.

不过,请注意:

The Android Drive API only works with the https://www.googleapis.com/auth/drive.file scope. This means that only files which a user has opened or created with your application can be matched by a query.

经过几个小时的浏览 Google 搜索了我的问题的不同变体,我终于找到了答案:

使它起作用的主要因素是调用 Drive.DriveApi.requestSync

新代码:

public static void connect(final Activity main){
    Drive.DriveApi.requestSync(((SWrpg)main.getApplication()).gac).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if(status.isSuccess()){
                final DriveFolder root = Drive.DriveApi.getRootFolder(((SWrpg)main.getApplication()).gac);
                root.queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                        .addFilter(Filters.eq(SearchableField.TITLE,"SWChars")).setSortOrder(new SortOrder.Builder()
                                .addSortDescending(SortableField.MODIFIED_DATE).build()).build())
                        .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                            @Override
                            public void onResult(@NonNull final DriveApi.MetadataBufferResult metBufRes) {
                                if(metBufRes.getStatus().isSuccess()){
                                    final MetadataBuffer metBuf = metBufRes.getMetadataBuffer();
                                    final DriveFolder[] charsFold = {null};
                                    for(Metadata met:metBuf){
                                        if(met.isFolder() && !met.isTrashed()){
                                            charsFold[0] = met.getDriveId().asDriveFolder();
                                            break;
                                        }
                                    }
                                    metBuf.release();
                                    if(charsFold[0] ==null){
                                        root.createFolder(((SWrpg)main.getApplication()).gac,
                                                new MetadataChangeSet.Builder().setTitle("SWChars").build())
                                                .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                    @Override
                                                    public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                        if(driveFolderResult.getStatus().isSuccess()){
                                                            charsFold[0] = driveFolderResult.getDriveFolder();
                                                            charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                                                    .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                                                    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                                                        @Override
                                                                        public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                                                            if(metadataBufferResult.getStatus().isSuccess()) {
                                                                                MetadataBuffer metBuffer = metadataBufferResult.getMetadataBuffer();
                                                                                final DriveFolder[] shipFold = {null};
                                                                                for (Metadata met:metBuffer){
                                                                                    if(met.isFolder()&&!met.isTrashed()){
                                                                                        shipFold[0] = met.getDriveId().asDriveFolder();
                                                                                        break;
                                                                                    }
                                                                                }
                                                                                metBuf.release();
                                                                                if(shipFold[0] ==null){
                                                                                    charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,
                                                                                            new MetadataChangeSet.Builder().setTitle("SWShips").build())
                                                                                            .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                                                @Override
                                                                                                public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                                                    if(driveFolderResult.getStatus().isSuccess()){
                                                                                                        shipFold[0] = driveFolderResult.getDriveFolder();
                                                                                                        ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                                                        ((SWrpg)main.getApplication()).vehicFold = shipFold[0];
                                                                                                        System.out.println("Done");
                                                                                                    }
                                                                                                }
                                                                                            });
                                                                                }
                                                                            }
                                                                            metadataBufferResult.release();
                                                                        }
                                                                    });
                                                        }
                                                    }
                                                });
                                    }else{
                                        charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                                .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                                .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                                    @Override
                                                    public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                                        if(metadataBufferResult.getStatus().isSuccess()){
                                                            MetadataBuffer mets = metadataBufferResult.getMetadataBuffer();
                                                            DriveFolder vehic = null;
                                                            for (Metadata met:mets){
                                                                if(met.isFolder()&&!met.isTrashed()){
                                                                    vehic = met.getDriveId().asDriveFolder();
                                                                    break;
                                                                }
                                                            }
                                                            mets.release();
                                                            if(vehic == null){
                                                                charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,new MetadataChangeSet.Builder()
                                                                        .setTitle("SWShips").build())
                                                                        .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                            @Override
                                                                            public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                                if(driveFolderResult.getStatus().isSuccess()){
                                                                                    ((SWrpg)main.getApplication()).vehicFold = driveFolderResult.getDriveFolder();
                                                                                    ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                                }
                                                                            }
                                                                        });
                                                            }else{
                                                                ((SWrpg)main.getApplication()).vehicFold = vehic;
                                                                ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                            }
                                                        }
                                                        metadataBufferResult.release();
                                                    }
                                                });
                                    }
                                    metBufRes.release();
                                }
                            }
                        });
            }
        }
    });
}