Android:Google Drive getMetaData()没有调用回调

时间:2017-04-11 18:27:22

标签: java android drive

我正在尝试使用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

这是否会进一步暗示可能出现问题的地方?

1 个答案:

答案 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);

} };