【问题标题】:get Google Drive Folder's ResourceID获取 Google Drive 文件夹的 ResourceID
【发布时间】:2016-06-24 11:47:32
【问题描述】:

我需要获取在我的驱动器中创建的文件夹的 resourceId。 参考了这些文档 firstsecond 我正在这样做:

 private void CreateFolderOnGoogleDrive() {
    Query query = new Query.Builder()
            .addFilter(Filters.and(Filters.eq(
                            SearchableField.TITLE, "Folder"),
                    Filters.eq(SearchableField.TRASHED, false)))
            .build();
    Drive.DriveApi.query(mGoogleApiClient, query)
            .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                @Override
                public void onResult(DriveApi.MetadataBufferResult result) {
                    if (!result.getStatus().isSuccess()) {
                        System.out.println("Cannot create folder in the root.");
                    } else {
                        boolean isFound = false;
                        for (Metadata m : result.getMetadataBuffer()) {
                            if (m.getTitle().equals("Folder")) {
                                Toast.makeText(getApplicationContext(), "folder exist", Toast.LENGTH_LONG).show();
                                isFound = true;
                                break;
                            }
                        }
                        if (!isFound) {
                            System.out.println("Folder not found; creating it.");
                            MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                                    .setTitle("Folder")
                                    .build();
                            Drive.DriveApi.getRootFolder(mGoogleApiClient)
                                    .createFolder(mGoogleApiClient, changeSet)
                                    .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                        @Override
                                        public void onResult(DriveFolder.DriveFolderResult result) {
                                            if (!result.getStatus().isSuccess()) {
                                                System.out.println("Error while trying to create the folder");
                                            } else {
                                                System.out.println("Created a folder");
}                                                
                                            }
                                              System.out.println(result.getDriveFolder().getDriveId().getResourceId());
// ALWAYS return as null

                                        });
                            }
                        }
                    }
                });

通过这段代码,我得到了 result 中的每个值,除了 getResourceId()(当我通过代码获取它时它总是为空)。

我什至可以在驱动器 url 中看到我的文件夹 ID。

已经做了很多研究,但没有一个给出任何解决方案。他们只给出了原因。

有人解决了吗?

【问题讨论】:

  • 我没有遇到过这个特殊的问题,尽管我已经阅读了资源 ID 的分配可以延迟的地方。看看stackoverflow.com/questions/22874657/…
  • 是的,但我猜它不能延迟一整天。
  • 我看到您试图获取资源 ID 的唯一地方是在创建文件夹的 onResult 回调中。此调用将始终在创建文件夹后立即发生,因此由于 GDAA 可能尚未同步,您可能会期望资源 id 的分配延迟。你是说24小时后用另一段代码(不是你贴的)检查文件夹的资源id,资源id还是null?
  • 我已将 driveId 放入共享 Pref 并再次获取它们,但仍然为空。甚至在间隔后尝试了一个线程

标签: android google-drive-android-api


【解决方案1】:

作为@seanpj 在Google Drive Android Api Completion Event for Folder Creation 的回答,您可以尝试以下方法,尽管目前这可能不是一个很好的解决方案。

AndroidManifest.xml 的&lt;application&gt; 内部:

<service android:name=".MyDriveEventService" android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.drive.events.HANDLE_EVENT"/>
    </intent-filter>
</service>

MyDriveEventService.java:

public class MyDriveEventService extends DriveEventService {
    ...
    @Override
    public void onCompletion(CompletionEvent completionEvent) {            
        DriveId driveId = completionEvent.getDriveId();
        Log.d(TAG, "File ResourceId: " + driveId.getResourceId());
        DriveId folderDriveId = MainActivity.getParentID(driveId);
        if (folderDriveId != null && folderDriveId.getResourceId() != null)
            Log.d(TAG, "Folder ResourceId: " + folderDriveId.getResourceId());
    }
}

MainActivity.java 内部:

@Override
public void onConnected(@Nullable Bundle bundle) {  
    MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
            .setTitle("NewFolder").build();
    Drive.DriveApi.getRootFolder(mGoogleApiClient).createFolder(
            mGoogleApiClient, changeSet).setResultCallback(folderCreatedCallback);
}

public static DriveId getParentID(DriveId driveId) {
    MetadataBuffer mdb = null;
    DriveApi.MetadataBufferResult mbRslt = driveId.asDriveResource().listParents(mGoogleApiClient).await();
    if (mbRslt.getStatus().isSuccess()) try {
        mdb = mbRslt.getMetadataBuffer();
        if (mdb.getCount() > 0)
            return mdb.get(0).getDriveId();
    } catch (Exception e) { e.printStackTrace();}
    finally {
        if (mdb != null) mdb.close();
    }
    return null;
}

private final ResultCallback<DriveFolder.DriveFolderResult> folderCreatedCallback = new
        ResultCallback<DriveFolder.DriveFolderResult>() {
            @Override
            public void onResult(DriveFolder.DriveFolderResult result) {
                if (!result.getStatus().isSuccess()) {
                    Log.e(TAG, "Error while trying to create the folder");
                    return;
                }

                Log.i(TAG, "Created a folder: " + result.getDriveFolder().getDriveId());
                Log.i(TAG, "Folder Resource Id: " + result.getDriveFolder().getDriveId().getResourceId()); // null

                // Creating an empty file
                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                        .setTitle("New file")
                        .setMimeType("text/plain").build();
                result.getDriveFolder().createFile(mGoogleApiClient, changeSet, null /* DriveContents */, new ExecutionOptions.Builder()
                                .setNotifyOnCompletion(true)
                                .build())
                        .setResultCallback(new ResultCallback<DriveFolder.DriveFileResult>() {
                            @Override
                            public void onResult(@NonNull DriveFolder.DriveFileResult driveFileResult) {
                            }
                        });

            }
        };    

Logcat 信息:

File ResourceId: 0B0sy1Vw2EUQINkdJRUR2R0puVDg
Folder ResourceId: 0B0sy1Vw2EUQIV3F2Zzl6RUdBdms

【讨论】:

  • getFolder 没有贬值吗?
  • 我觉得你可以改用result.getDriveFolder().createFile(...)
  • 你能告诉我一件事如何获取空文件夹的resourceId。
  • 很遗憾,我没有找到空文件夹的解决方案,你可以试试这个问题stackoverflow.com/questions/37089745/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多