【问题标题】:Google Drive API - Android - How to obtain a drive file id?Google Drive API - Android - 如何获取驱动器文件 ID?
【发布时间】:2015-01-22 08:41:56
【问题描述】:

我正在尝试开发一个可以读取存储在我的 google drive 文件夹中的 xml 文件的 android 应用程序,最初的想法是尝试打开文件并处理内容。

我已经阅读了Google Drive API docs for android 并且我达到了我迷失的地步,它正在处理文件内容。

根据本指南,从驱动器打开文件的方法是这样的:

DriveFile file = ...
file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null).setResultCallback(contentsOpenedCallback);`

搜索我意识到完整的代码(它们不包括在内):

DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient,DriveId.bg(id));
file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null).setResultCallback(contentsOpenedCallback);`

问题是我不知道文件“id”。我已经尝试过来自谷歌驱动器的网络链接的 id,类似这样 (https://drive.google.com/open?id=1EafJ-T6H4xI9VaUuUO5FMVb9Y30xyr7OHuISQ53avso&authuser=0) 但没有用。

【问题讨论】:

标签: android google-drive-api google-drive-android-api


【解决方案1】:

您可以使用 DriveAPI 查询方法来检索有关特定文件的任何信息。您需要定义一个查询对象,如下所示:

Query query = new Query.Builder()
    .addFilter(Filters.eq(SearchableField.TITLE, "HelloWorld.java"))
    .build();

并设置一个回调函数来迭代结果:

Drive.DriveApi.query(googleApiClient, query)
        .setResultCallback(new OnChildrenRetrievedCallback() {

    @Override
    public void onChildrenRetrieved(MetadataBufferResult result) {
        // Iterate over the matching Metadata instances in mdResultSet
    }
});

您可以在此处找到有关该主题的更多信息:https://developers.google.com/drive/android/queries

【讨论】:

  • 此 API 现已弃用。
【解决方案2】:

几个月前我一直在玩这些东西,并且在 GitHub 上还有一些代码。它可能非常过时(libver 15 左右),但它可以作为参考点,而且很简单。 Look here。把它拉下来,插上电源,穿过。修复不再起作用的东西:-)。前段时间我已经放弃了。

请注意,Google Drive Android API 对象有 2 个不同的 ID,请参阅 SO 22841237

通常,您通常从知道文件/文件夹名称开始,查询 GDAA 以获取对象列表。它们中的每一个都会产生 DriveID 和 ResourceID。 DriveID 在您的应用程序中用于操作对象(并不意味着您的 Android 应用程序和/或设备之外的任何内容)。 ResourceID 是在 URL 中以不同形式出现的字符串,可以在您的应用程序外部使用(例如 Web 浏览器......)。看看这个wrapper 来感受一下它是如何工作的。但同样,它已经有几个版本了,所以没有任何保证。

【讨论】:

    【解决方案3】:

    我为这个问题找到的解决方案是从应用程序创建文件。使用来自 google drive api 演示应用的类 ("CreateFileActivity.java")。

    通过这个类,我将新文件返回的 Driveid 保存在全局 DriveId 变量中。

    final private ResultCallback<DriveFolder.DriveFileResult> fileCallback = new
            ResultCallback<DriveFolder.DriveFileResult>() {
                @Override
                public void onResult(DriveFolder.DriveFileResult result) {
                    if (!result.getStatus().isSuccess()) {
                        Log.e("","Error while trying to create the file");
                        return;
                    }
                    Id=result.getDriveFile().getDriveId();
                    Log.e("","Created a file with content: " + Id);
    
                }
            };
    

    然后在另一种方法中使用此 ID 调用文件并读取它(如果我愿意,我可以从 Google Drive Web App 编辑此文件信息):

     public void leer(){
           DriveFile file = Drive.DriveApi.getFile(getGoogleApiClient(),Id);
           file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null)
                   .setResultCallback(contentsOpenedCallback);
       }
    ResultCallback<DriveApi.DriveContentsResult> contentsOpenedCallback =
            new ResultCallback<DriveApi.DriveContentsResult>() {
                @Override
                public void onResult(DriveApi.DriveContentsResult result) {
                    if (!result.getStatus().isSuccess()) {
                        Log.e("Error:","No se puede abrir el archivo o no se encuentra");
                        return;
                    }
                    // DriveContents object contains pointers
                    // to the actual byte stream
                    DriveContents contents = result.getDriveContents();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(contents.getInputStream()));
                    StringBuilder builder = new StringBuilder();
                    String line;
                    try {
                        while ((line = reader.readLine()) != null) {
                            builder.append(line);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    String contentsAsString = builder.toString();
                    Log.e("RESULT:",contentsAsString);
                }
            };
    

    【讨论】:

    • 但是我怎样才能编辑同一个文件的内容,请问你能发布一些代码吗?
    【解决方案4】:

    Google Drive API 已弃用,现在它的 Google Drive V3 和我们使用的查询

    String pageToken = null;
      do {
      FileList result = driveService.files().list()
      .setQ("mimeType='image/jpeg'")
      .setSpaces("drive")
      .setFields("nextPageToken, files(id, name)")
      .setPageToken(pageToken)
      .execute();
      for (File file : result.getFiles()) {
      System.out.printf("Found file: %s (%s)\n",
        file.getName(), file.getId());
      }
      pageToken = result.getNextPageToken();
      } 
    
      while (pageToken != null);
    

    您可以在这里了解更多信息Officals Docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2023-02-08
      • 1970-01-01
      相关资源
      最近更新 更多