我整天都在与这段代码作战,没有运气。我首先从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中讨论了一个相关的问题。
祝好运