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

时间:2014-03-20 17:01:07

标签: 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.");

然后我调用ListFilesInFolderActivity,我认为它正在填充ListView(当我说调用时,我正在使用新的意图来显示活动)。

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

我的目的是显示“已挑选”文件夹中的所有文件并使其可选(多选)。

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

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

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

由于

2 个答案:

答案 0 :(得分: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。

我希望很清楚。

P.S。

顺便说一句,要在拾取文件或文件夹之间进行选择,您必须设置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

答案 1 :(得分:0)

问题是此SDK仅提供SCOPE_FILE访问权限,您无法列出具有此类访问权限的所有用户文件。

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