java - Google Drive API - 在 ListView 中填充文件列表

标签 java android google-drive-api

我正在使用此处找到的演示作为我的应用程序的指南:

https://github.com/googledrive/android-demos/tree/master/src/com/google/android/gms/drive/sample/demo

我首先使用 PickFolderWithOpenerActivity.java 检索 Google 云端硬盘文件夹 responseID。我希望用户首先向下钻取并选择一个文件夹,然后显示该文件夹中的所有文件(并且可以选择)

OpenFileActivityBuilder 在我的应用程序中正常打开,然后我可以浏览文件夹结构,然后按“选择”按钮以选择该文件夹。

在 PickFolderWithOpenerActivity.java 中,我用 responseID 覆盖了 EXISTING_FOLDER_ID(此响应 ID 匹配驱动器文件夹 URL,即粗体部分:https://drive.google.com/?authuser=0#folders/ 0AwbfSlc3Y1XYUXpZU0Vac1JXY28) :

本质上,EXISTING_FOLDER_ID = 0AwbfSlc3Y1XYUXpZU0Vac1JXY28

DriveId driveId = (DriveId) data.getParcelableExtra(
                            OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
    EXISTING_FOLDER_ID = driveId.getResourceId();

然后我调用“ListFilesInFolderActivity.java”:

public class ListFilesInFolderActivity extends BaseActivity  {

private ListView mResultsListView;
private ResultsAdapter mResultsAdapter;
//private static DriveId sFolderId = DriveId.decodeFromString(EXISTING_FOLDER_ID); // this causes error

@Override
public void onConnected(Bundle connectionHint) {
    super.onCreate(connectionHint);
    setContentView(R.layout.activity_listfiles);
    mResultsListView = (ListView) findViewById(R.id.listViewResults);
    mResultsAdapter = new ResultsAdapter(this);
    mResultsListView.setAdapter(mResultsAdapter);

    showMessage("EXISTING_FOLDER_ID:" + EXISTING_FOLDER_ID);
    Drive.DriveApi.fetchDriveId(getGoogleApiClient(), EXISTING_FOLDER_ID)
            .setResultCallback(idCallback);



}

final private ResultCallback<DriveIdResult> idCallback = new ResultCallback<DriveIdResult>() {
    @Override
    public void onResult(DriveIdResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Cannot find DriveId. Are you authorized to view this file?");
            return;
        }
        DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), result.getDriveId());
        showMessage("Result driveId is:  " + result.getDriveId());
        folder.listChildren(getGoogleApiClient())
                .setResultCallback(metadataResult);



    }
};

final private ResultCallback<MetadataBufferResult> metadataResult = new
        ResultCallback<MetadataBufferResult>() {
            @Override
            public void onResult(MetadataBufferResult result) {
                if (!result.getStatus().isSuccess()) {
                    showMessage("Problem while retrieving files");
                    return;
                }
                mResultsAdapter.clear();
                mResultsAdapter.append(result.getMetadataBuffer());

                showMessage("Successfully listed files.");
                Intent intent2 = new Intent(ListFilesInFolderActivity.this, ListFilesActivity.class);
                startActivity(intent2);
            }
        };

当我收到以下消息时,一切正常:

 showMessage("Successfully listed files.");

然后我调用我认为正在填充 ListView 的 ListFilesInFolderActivity(当我说调用时,我正在使用新的 Intent 来显示 Activity )。

但问题是 ListView 中仅列出顶级文件夹和文件。不是所选文件夹中的文件。

我的目的是显示该“已选择”文件夹中的所有文件并使它们可选择(多选)。

我尝试使用“PickFileWithOpenerActivity”,但它只允许您从谷歌驱动器中选择一个文件。我希望能够选择一个文件夹中的多个文件。 (我认为没有办法改变它)

有人可以看一下示例代码并让我知道是否需要更改任何内容以使 ListView 填充 所有 SELECTED 文件夹中的文件,(并使列表多选)?

我根本不应该使用 responseID 吗?我应该只使用 driveId 吗?

谢谢

最佳答案

问题出在作用域上。

Google Drive Android API 仅提供 drive.file 和 drive.appfolder 范围。

文件范围意味着只能访问用户从您的应用程序中选择的那些文件。 Drive.DriveApi.newOpenFileActivityBuilder() 对话框将允许用户浏览整个驱动器,但您的应用程序将被授予仅访问用户特别选择的那些文件或文件夹的权限。

假设您的驱动器上有以下文件夹结构 -

/root
  |
  +---books
      +---c++
          +---programming_gems.pdf
          +---c++_notes.docs

现在使用 Drive.DriveApi.newOpenFileActivityBuilder() 获取 programming_gems.pdf。您的应用现在已获得对该 pdf 的访问权限。您可以检索文件及其元数据。但是您的应用程序将无法访问其父文件夹,在这种情况下为 c++。为什么?因为用户尚未授予对 c++ 文件夹的访问权限;只有该文件夹中的特定文件。这也是有道理的;否则您可以从该文件夹中检索任何文件,让您的用户担心。

使用相同的 Drive.DriveApi.newOpenFileActivityBuilder() 选择 c++ 文件夹。现在,如果您的应用尝试检索 programming_gems.pdf 的父文件夹,它就会被授予访问权限。

现在再尝试一件事;尝试列出 c++ 文件夹本身的内容。什么将返回到您的应用程序? - 只有 programming_gems.pdf。为什么,因为用户尚未授予对其他文件 c++_notes.docs 的访问权限。

希望我清楚。

附言

顺便说一句,要在选取文件或文件夹之间进行选择,您必须设置 mime 类型。参见下面的代码,例如,

if (openFolder) {
    mime_type = new String[]{DriveFolder.MIME_TYPE};
} else {
    mime_type = new String[]{};
}

IntentSender intentSender = Drive.DriveApi
        .newOpenFileActivityBuilder()
        .setMimeType(mime_type)
        .build(getGoogleApiClient());

如果此范围方案不符合您的要求,您可以选择使用 Google Drive REST API - 继续阅读 - https://stackoverflow.com/a/25871516/1363471

关于java - Google Drive API - 在 ListView 中填充文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22540115/

相关文章:

java - 如何在scala中获取笑脸的Unicode

java - 高效地从 Google Cloud Storage 中删除多个 blob

android - 我可以在 Flutter 中为 Android 应用程序安装应用程序后更改应用程序图标和名称吗?

Android:launchMode ="singleTask"的安全异常

javascript + html5 音频播放器cors不播放动态源码

python gspread - 如何在创建电子表格后获取电子表格 URL 路径?

java - 使用FFT查找音频频率变化的非常简单的解释

java - Eclipse 在错误的目录中创建 JUnit 测试

android - 行中子项的填充高度

php - 从 PHP 连接到位于 Google Drive 中的 SQLite 数据库