【问题标题】:Google Drive API - populating list of files in ListViewGoogle Drive API - 在 ListView 中填充文件列表
【发布时间】:2014-09-17 17:15:13
【问题描述】:

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

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

我首先使用 PickFolderWithOpenerActivity.java 来检索 Google Drive 文件夹 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(当我说调用时,我正在使用新的意图来显示活动)。

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

我的意图是显示该“选择”文件夹中的所有文件并使其可选择(多选)。

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

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

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

谢谢

【问题讨论】:

  • 谁能帮忙解决这个问题,也许是 Cheryl Simon?谢谢
  • 如果有人可以提供帮助,仍然需要帮助。

标签: java android google-drive-api


【解决方案1】:

问题出在范围上。

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

【讨论】:

    【解决方案2】:

    问题是这个 SDK 只提供 SCOPE_FILE 访问,你不能列出所有具有这种访问权限的用户文件。

    我希望他们将来会提供更多访问权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多