当前位置: 首页 > 知识库问答 >
问题:

谷歌驱动器更改订阅不起作用?

丌官炎彬
2023-03-14

我试图让“更改订阅”使用Android的驱动器API工作,但到目前为止还没有成功。

    null

有人知道这个问题的解决方案吗,或者能指出我做错了什么吗?

我编写了一些简单的testcode(见下文),它只需要连接的GooglePiclient,下面是我测试的内容:

1.

testfile.txt created, driveId=DriveId:CAESABi0AyDAu9XZhVMoAA== resourceId=null
onCompletion; driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYtAMgwLvV2YVTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU
STATUS_SUCCESS 
added subscription to testfile.txt, driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYtAMgwLvV2YVTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU
added subscription to testfile.txt, driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYwgIg9I-GyZRTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU

3.

如果我通过testFileUpdate用一些新数据更新文件,我会在设备1上得到以下结果:

testfile.txt updated, driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYtAMgwLvV2YVTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU

设备2:

testfile.txt updated, driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYwgIg9I-GyZRTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU
onChange; driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYwgIg9I-GyZRTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU
contentChanged
onChange; driveId=DriveId:CAESHDBCLXNzaGVuNGlURkFOMGh0ZWtGWU5FeHVTRVUYwgIg9I-GyZRTKAA= resourceId=0B-sshen4iTFAN0htekFYNExuSEU
metadataChanged
private boolean testFileWriteNew() {
    final DriveFolder folderRoot = Drive.DriveApi.getRootFolder(mGoogleApiClient);
    DriveContentsResult contentsResult = Drive.DriveApi.newDriveContents(mGoogleApiClient).await();
    if (!contentsResult.getStatus().isSuccess()) {
        return false;
    }
    DriveContents originalContents = contentsResult.getDriveContents();
    OutputStream os = originalContents.getOutputStream();

    try {
        os.write(String.valueOf(System.currentTimeMillis()).getBytes());
        MetadataChangeSet originalMetadata = new MetadataChangeSet.Builder().setTitle("testfile.txt").setMimeType("text/plain").build();
        // create the file in root
        DriveFolder.DriveFileResult fileResult = folderRoot.createFile(mGoogleApiClient, originalMetadata, originalContents, new ExecutionOptions.Builder().setNotifyOnCompletion(true).build()).await();
        if (!fileResult.getStatus().isSuccess()) {
            return false;
        }
        // check 'locally created' file, not yet synced to drive
        DriveResource.MetadataResult metadataResult = fileResult.getDriveFile().getMetadata(mGoogleApiClient).await();
        if (!metadataResult.getStatus().isSuccess()) {
            return false;
        }
        Log.d(TAG, "testfile.txt created, driveId=" + metadataResult.getMetadata().getDriveId().encodeToString() + " resourceId=" + metadataResult.getMetadata().getDriveId().getResourceId());
        return true;
    } catch (IOException ioe) {
        return false;
    }
}


private boolean testFileUpdate() {
    final DriveFolder folderRoot = Drive.DriveApi.getRootFolder(mGoogleApiClient);

    // find testfile
    DriveId testFile = null;
    MetadataBufferResult folderFilesSyncFolder = folderRoot.listChildren(mGoogleApiClient).await();
    if (!folderFilesSyncFolder.getStatus().isSuccess()) {
        return false;
    } else {
        MetadataBuffer bufferMetaData = folderFilesSyncFolder.getMetadataBuffer();
        for(int i = 0; i < bufferMetaData.getCount(); ++i) {
            final Metadata data = bufferMetaData.get(i);
            if(!data.isFolder() && !data.isTrashed() && data.isEditable() && data.getTitle().equalsIgnoreCase("testfile.txt")) {
                testFile = data.getDriveId();
                break;
            }
        }
        bufferMetaData.release();
    }

    if(testFile == null) {
        return false;
    }

    // update testfile
    DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, testFile);
    DriveContentsResult driveContentsResult = file.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null).await();
    if (!driveContentsResult.getStatus().isSuccess()) {
        return false;
    }
    DriveContents originalContents = driveContentsResult.getDriveContents();
    OutputStream os = originalContents.getOutputStream();
    try {
        os.write(String.valueOf(System.currentTimeMillis()).getBytes());
        // commit changes
        com.google.android.gms.common.api.Status status = originalContents.commit(mGoogleApiClient, null).await();
        if(!status.isSuccess()) {
            return false;

        }
        Log.d(TAG, "testfile.txt updated, driveId=" + file.getDriveId().encodeToString() + " resourceId=" + file.getDriveId().getResourceId());
        return true;
    } catch (IOException ioe) {
        return false;
    }
}

private boolean testFileAddAndRemoveSubscription(boolean subscribe) {
    final DriveFolder folderRoot = Drive.DriveApi.getRootFolder(mGoogleApiClient);

    // find testfile
    DriveId testFile = null;
    MetadataBufferResult folderFilesSyncFolder = folderRoot.listChildren(mGoogleApiClient).await();
    if (!folderFilesSyncFolder.getStatus().isSuccess()) {
        return false;
    } else {
        MetadataBuffer bufferMetaData = folderFilesSyncFolder.getMetadataBuffer();
        for(int i = 0; i < bufferMetaData.getCount(); ++i) {
            final Metadata data = bufferMetaData.get(i);
            if(!data.isFolder() && !data.isTrashed() && data.isEditable() && data.getTitle().equalsIgnoreCase("testfile.txt")) {
                testFile = data.getDriveId();
                break;
            }
        }
        bufferMetaData.release();
    }

    if(testFile == null) {
        return false;
    }

    // subscribe & unsubscribe
    DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, testFile);
    if(subscribe) {
        com.google.android.gms.common.api.Status status = file.addChangeSubscription(mGoogleApiClient).await();
        if(!status.isSuccess()) {
            return false;
        }
        Log.d(TAG, "added subscription to testfile.txt, driveId=" + file.getDriveId().encodeToString() + " resourceId=" + file.getDriveId().getResourceId());
        return true;
    } else {
        com.google.android.gms.common.api.Status status = file.removeChangeSubscription(mGoogleApiClient).await();
        if(!status.isSuccess()) {
            return false;
        }
        Log.d(TAG, "removed subscription from testfile.txt, driveId=" + file.getDriveId().encodeToString() + " resourceId=" + file.getDriveId().getResourceId());
        return true;
    }
}
public class ChangeService extends DriveEventService {

    // TAG
    private static final String TAG = ChangeService.class.getSimpleName();

    @Override
    public void onChange(ChangeEvent event) {
        final DriveId driveId = event.getDriveId();
        Log.e(TAG, "onChange; driveId=" + driveId.encodeToString() + " resourceId=" + driveId.getResourceId());
        if(event.hasContentChanged())       { Log.e(TAG, "contentChanged"); }
        else if(event.hasMetadataChanged()) { Log.e(TAG, "metadataChanged"); }
        else if(event.hasBeenDeleted())     { Log.e(TAG, "beenDeleted"); }
    }

    @Override
    public void onCompletion(CompletionEvent event) {
        final DriveId driveId = event.getDriveId();
        Log.e(TAG, "onCompletion; driveId=" + driveId.encodeToString() + " resourceId=" + driveId.getResourceId());
        switch (event.getStatus()) {
          case CompletionEvent.STATUS_CONFLICT:  Log.e(TAG, "STATUS_CONFLICT");  break;
          case CompletionEvent.STATUS_FAILURE:   Log.e(TAG, "STATUS_FAILURE");   break;
          case CompletionEvent.STATUS_SUCCESS:   Log.e(TAG, "STATUS_SUCCESS ");  break;
          case CompletionEvent.STATUS_CANCELED:  Log.e(TAG, "STATUS_CANCELED "); break;
        }
        event.dismiss();
    }

}

共有1个答案

刘俊语
2023-03-14

我相信,你正落入我们许多人以前所做的同样的陷阱。我最初也假设“DriveEventService”负责在同一帐户下运行的多个设备之间的通知。我尝试了,但失败得很惨,看这里(并注意到响亮的沉默--自2014年4月以来)。我总是只在一个设备上获取事件。因此,我实际上意识到变更事件只在GooPlaySvcs实例中本地工作。

Steve Bazyl在这篇不相关的回答中发表了一篇评论,或多或少地证实了这一点(请阅读包括“原始帖子”的段落),证实了我的理论,即“更改事件”和“完成事件”都是本地的(完成事件报告网络操作的结果--类似于http响应)。

来回答你的问题。在与此斗争了一段时间后,我不得不制定一个不同的策略:

坦率地说,我不明白这是什么,这是为了什么,如果完成事件没有及时反映(通知)来自另一个设备的更新。

祝你好运

 类似资料:
  • 我正在使用google drive api来管理多个用户的一些文件。现在我想知道如何将一些文件的所有权转移给另一个用户。

  • 下面是https://github.com/google/google-api-nodejs-client的代码。 一般问题:刷新令牌实际上如何与访问令牌一起工作? 背景:根据我的解释,每个访问令牌都有一个有限的时间跨度(~1小时)。因此,当用户第一次连接到我的服务器(服务器为用户身份验证提供了机制)时,服务器将收到有限生命期访问令牌和一次性刷新令牌。1小时后,访问令牌过期。 谢了!

  • 目前是否已知 Google 云端硬盘 API 示例命令行应用(云端硬盘命令行)可以正常工作?我已经下载了 Java 客户机库,并编译了示例应用程序(插入通过指定“已安装的应用程序”和“其他”创建的应用程序的客户机标识和密钥)。它运行并通知我在浏览器中访问以下链接: https://accounts.google.com/o/oauth2/auth?access_type=online (显然我的实

  • 我是GCP的新手,目前有一个使用GKE和gRPC的微服务架构。微服务正在向Google Cloud Pub/Sub发布事件。我的Web-UI正在使用Google Cloud Endpoint向微服务发送请求。我想在网站上有很多实时/推送更新(例如实时更新用户统计数据等),现在想知道如何最好地做到这一点。让Web-UI订阅Google Cloud Pub/Sub中的主题是不是一种不好的做法?GCP中

  • 提供的检索/更新API是否有任何限制? 我找到了这些文件: https://cloud.google.com/pubsub/quotas:包含有关吞吐量的信息以及主题、订阅和消息创建数量的限制 检索/更新API的限制呢? 例如:检索具有名称的主题,更新订阅。

  • 这是我收到的错误