我整天都在与这段代码作战,没有运气。我首先从Google遵循此代码sample

问题是成功创建了文件夹,但是在 onResult()内,我总是得到无效或不完整的DriveId或resourceId。这意味着我无法在创建的文件夹内创建文件。这是我正在使用的代码:

public class CreateFolderActivity extends BaseDemoActivity {

@Override
public void onConnected(Bundle connectionHint) {
    super.onConnected(connectionHint);
    MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
            .setTitle("MyAppFolder").build();
    Drive.DriveApi.getRootFolder(getGoogleApiClient()).createFolder(
            getGoogleApiClient(), changeSet).setResultCallback(callback);
}

final ResultCallback<DriveFolderResult> callback = new ResultCallback<DriveFolderResult>() {
    @Override
    public void onResult(DriveFolderResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Error while trying to create the folder");
            return;
        }

        // this value is always invalid with ending == operators
        Log.d("DRIVEID", "Created a folder: " + result.getDriveFolder().getDriveId());
    }
  };
}

每当我运行此代码时,我都会得到以下不完整的ID:
CAESABi2VyCCzdWOuVMoAQ==

我不知道这里发生了什么!

我到处都是Google,并且读过一些关于添加侦听器来侦听完成事件的信息,但是它们似乎都不起作用。

我在SO上看到了几乎类似的问题,但没有一个对我有用。

应用创建后,我通过浏览器手动复制了FolderId,然后将其粘贴到我的android代码中,应用成功创建了文件。但这不是应该的方式。

我是否要等待同步完成?如果是,该如何做?

先感谢您!

最佳答案

您的问题的答案可能可以找到here。您得到的DriveId可以,但是您不应该直接处理它。这是一个“初步” DriveId,在提交对象后会更改(同样,请参见SO 22874657)。您可以将您获取的DriveId与在“onCompletion(CompletionEvent event)”中获取的DriveId进行比较,以对其进行测试。

这只是GDAA逻辑的副作用之一,使您免受在线/离线网络状态的影响,从而导致不可预测的延迟。您只需要依靠回调即可。

但是令我惊讶的是,您不能立即将此“初步” DriveId(如果是文件夹)用作另一个对象(文件夹/文件)的父级。我从未经历过,因此将“初步” DriveId立即传递给另一个GDAA方法。
如果使用ResourceId,则有所不同。那是GDAA中的第二个,仅当您离开设备时才使用。 GDAA直到提交(上载)对象后才知道它。

我在此demo中使用了类似的逻辑(创建文件夹/文件树)(请参见MainActivity.createTree()方法)。欢迎您来研究它。

SO 34318220中讨论了一个相关的问题。

祝好运

10-01 00:54