如何获取文件ID,以便在Android上从Google Drive API下载文件?

如何获取文件ID,以便在Android上从Google Drive API下载文件?,android,google-drive-api,Android,Google Drive Api,我正在做一个Android项目,我正在尝试使用GoogleDriveAPI,我已经让它大部分工作正常,但我在如何执行下载方面遇到了一个问题 我在任何地方都找不到如何获取文件ID以便执行下载。为了进行测试,我检索了驱动器帐户中的所有文件,并将它们添加到列表数组中,然后获取列表中第一个文件的ID 然后我将文件ID复制到命令中以下载该文件,该操作成功,但我不知道如何获取要下载的特定文件的文件ID 下面是我用来下载文件的代码 private void downloadFile() { Threa

我正在做一个Android项目,我正在尝试使用GoogleDriveAPI,我已经让它大部分工作正常,但我在如何执行下载方面遇到了一个问题

我在任何地方都找不到如何获取文件ID以便执行下载。为了进行测试,我检索了驱动器帐户中的所有文件,并将它们添加到列表数组中,然后获取列表中第一个文件的ID

然后我将文件ID复制到命令中以下载该文件,该操作成功,但我不知道如何获取要下载的特定文件的文件ID

下面是我用来下载文件的代码

private void downloadFile()
{
    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            try 
            {
                com.google.api.services.drive.model.File file = service.files().get("0B-Iak7O9SfIpYk9zTjZvY2xreVU").execute();
                //FileList file = service.files().list().execute();
                //List<com.google.api.services.drive.model.File> fileList = file.getItems();
                //com.google.api.services.drive.model.File fileItem = fileList.get(0);
                //Log.d("FileID" , fileItem.getId());
                //Log.d("Count", "Retreived file list");
                if (file.getDownloadUrl() != null && file.getDownloadUrl().length() > 0)
                {
                    HttpResponse resp = service.getRequestFactory().buildGetRequest(new GenericUrl(file.getDownloadUrl())).execute();
                    InputStream inputStream = resp.getContent();
                    writeToFile(inputStream);
                }
            } 
            catch (IOException e)
            {
                Log.e("WriteToFile", e.toString());
                e.printStackTrace();
            }
        }
    });
    thread.start();
}
private void downloadFile()
{
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{
尝试
{
com.google.api.services.drive.model.File File File=service.files().get(“0B-Iak7O9SfIpYk9zTjZvY2xreVU”).execute();
//FileList file=service.files().list().execute();
//List fileList=file.getItems();
//com.google.api.services.drive.model.File fileItem=fileList.get(0);
//Log.d(“FileID”,fileItem.getId());
//Log.d(“计数”、“检索文件列表”);
if(file.getDownloadUrl()!=null&&file.getDownloadUrl().length()>0)
{
HttpResponse resp=service.getRequestFactory().buildGetRequest(新的GenericUrl(file.getDownloadUrl()).execute();
InputStream InputStream=resp.getContent();
写入文件(inputStream);
}
} 
捕获(IOE异常)
{
Log.e(“WriteToFile”,e.toString());
e、 printStackTrace();
}
}
});
thread.start();
}
0B-Iak7O9SfIpYk9zTjZvY2xreVU
是我下载的文件的文件ID,当我列出并选择第一个文件时检索到该文件,但是我如何说我要下载,文件1并获取其ID,然后将其传递给服务。get()。执行函数


基本上,我的最终目标是在我的应用程序中,我将一个XML文件上传到GoogleDrive,然后稍后下载该文件。它将只有一个文件,并且始终具有相同的名称。我是立即着手还是有更好的方法来实现我的目标?

我能想到的第一个选择是,你可以发送一个
列表
请求,比如
title=“file\u 1.xml”和fileExtension=“xml”
。它将返回一个空的文件列表(没有一个符合serach标准),或者返回一个至少包含一个文件的列表。如果只有一个,那很容易。但是如果有更多,您必须根据其他字段选择其中一个。请记住,在gdrive中,可以有多个同名文件。因此,您提供的搜索参数越多越好。

Stan0 initial idea不是一个好主意。可以有多个同名文件。非常容易出错的实现。Stan0的第二个想法是正确的方法

当您第一次将文件上载到google drive时,请存储其id(在SharedReferences中可能是最简单的),以供以后使用


如果您知道该文件的名称,并且始终希望下载该特定文件,那么您可以从以下位置轻松获得所需文件的ID和其他属性:(在底部,您将找到运行查询的方法)。在q字段中输入title='your_file_name'并运行它。您应该看到一些结果显示在右下方,其中应该有一个“id”字段。这就是你要找的身份证


您还可以从以下位置使用其他参数:

此脚本记录驱动器中的所有文件名和ID:

// Log the name and id of every file in the user's Drive
function listFiles() {
  var files = DriveApp.getFiles();
  while ( files.hasNext() ) {
    var file = files.next();
    Logger.log( file.getName() + ' ' + file.getId() );
  }
}  

此外,“”页面的末尾有一个表单,其中列出了驱动器中所有文件的元数据,可以在您只需要几个ID的情况下使用

一种方法是在创建文件时将唯一属性与文件关联起来

properties = "{ \
    key='somekey' and \
    value='somevalue'
}"
然后创建一个查询

query = "title = " + "\'" + title + "\'" + \
        AND + "mimeType = " + "\'" + mimeType + "\'" + \
        AND + "trashed = false" + \
        AND + "properties has " + properties

您已经知道的所有文件属性(标题等)都可以转到此处+属性。

在我看来,获取Google Drive文件ID最简单、最快速的方法是从web上的Google Drive。右键单击文件名,然后选择“获取可共享链接”。链接的最后一部分是文件ID。然后您可以取消共享。

用鼠标右键单击Google驱动器中的文件。选择该选项以获取可从菜单共享的链接。现在您将看到文件id。别忘了撤销共享。

谢谢你的帮助,告诉android获取所有文件的列表,然后遍历所有文件以找到我想要的文件,这样我就可以获得ID。我只希望提供一个文件名并检索ID。谢谢,虽然我会试一试,但你并不是真的告诉安卓去做,而是谷歌的服务器。这样他们的服务器就可以完成您的工作(从(可能很长的)文件列表中筛选正确的文件)。另外,通过网络传输的数据更少。是的,我明白你的意思,只是看起来很慢而且冗长,当我列出测试的文件id时,在问题中提到,需要几秒钟才能完成,我不认为我的驱动器帐户中有过多的文件。您也可以尝试保留id以供进一步参考。我想我还没有读到关于这个的任何东西,但是可能id是恒定的。不过我不确定。这只是一个想法。id是恒定的,即使文件名更改也会持久。这应该是建议的答案,这是最简单的!这是一种黑客行为,可能还假设你有权限管理文件hello@RomDoc,ID是字母数字代码,长49个字符吗?左边是d,右边是usp=sharing我能看到吗
query = "title = " + "\'" + title + "\'" + \
        AND + "mimeType = " + "\'" + mimeType + "\'" + \
        AND + "trashed = false" + \
        AND + "properties has " + properties