我正在尝试使用Google Drive API来允许用户选择文件并(到目前为止)获取其中的元数据。
这是我在(提取)的地方:
@Override
public void onConnected(Bundle connectionHint) {
super.onConnected(connectionHint);
IntentSender intentSender = Drive.DriveApi
.newOpenFileActivityBuilder()
.build(getGoogleApiClient());
try {
startIntentSenderForResult(
intentSender, REQUEST_CODE_OPENER, null, 0, 0, 0);
} catch (SendIntentException e) {
Log.w(TAG, "Unable to send intent", e);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_OPENER:
if (resultCode == RESULT_OK) {
if (data != null) {
DriveId driveId = data.getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
Log.d(TAG, "driveId = " + driveId.encodeToString());
//driveId.asDriveResource().getMetadata(getGoogleApiClient())
driveId.asDriveFile().getMetadata(getGoogleApiClient())
.setResultCallback(new ResultCallback<DriveResource.MetadataResult>() {
public void onResult(@NonNull DriveResource.MetadataResult mdr) {
// Never gets here
}
});
}
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
似乎工作得很好。它记录它找到的DriveId
并进入getMetadata()
调用。但它从不调用回调:永远不会达到onResult()
。
我觉得我几乎肯定会做一些明显错误的事情,但在研究API文档和Google示例代码时,我无法发现它是什么。
已编辑添加:
我尝试将其从使用setResultCallback()
更改为await()
(在一个帖子中),但DriveID
再次正常,MetadataResult
有一个statusCode
} CANCELED
(即使我从Drive文件选择器中单击SELECT)。因此,在其上调用getMetadata()
会返回null
。
这是否会进一步暗示可能出现问题的地方?
答案 0 :(得分:0)
检查getMetadata()。setResultCallBack()代码Overlapped views
在上面的代码中,您将onResult块保持为空。 您应该使用onResult块中的MetaDataResult obj来获取有关所需文件/文件夹的元数据。
检查MetaDataResult obj
上的状态是否成功 final ResultCallback<MetadataResult> metadataCallback = new ResultCallback<MetadataResult>() {
@Override
public void onResult(MetadataResult result) {
if (!result.getStatus().isSuccess()) {
showMessage("Problem while trying to retrieve the file metadata");
return;
}
if (result.getMetadata().isPinnable()) {
showMessage("File is pinnable");
}
};
有关MetaData的更多信息,请参阅here
如果其元数据回调不成功,则其driveId不匹配
尝试此SO线程中的方法以获取该文件的正确ID android doc
你可以在driveId上获得:Drive.DriveApi.fetchDriveId(getGoogleApiClient(), driveId.getResourceId()).setResultCallback(idCallback);
final ResultCallback<DriveApi.DriveIdResult> idCallback = new ResultCallback<DriveApi.DriveIdResult>() {
@Override
public void onResult(DriveApi.DriveIdResult result) {
if (!result.getStatus().isSuccess()) {
showMessage("Cannot find DriveId. Are you authorized to view this file?");
return;
}
DriveId driveId = result.getDriveId();
showLogDebug(driveId + " in idCallback of fetchId");
DriveFile file = driveId.asDriveFile();
file.getMetadata(getGoogleApiClient()).setResultCallback(metadatacallBack);
} };