2013-02-24 99 views
11

我正在开发一个Android项目,我正在尝试使用Google Drive API,并且我已经获得了大部分它工作,但我在如何执行下载时遇到问题。如何获取文件ID,以便我可以从Android上的Google Drive API执行文件下载

我无法找到任何地方我如何获取文件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(); 
} 

0B-Iak7O9SfIpYk9zTjZvY2xreVU是我下载的文件时,我做了一个列表,选择的第一个文件,我检索到的文件ID,但我怎么能说我想下载,File_1并获得其ID来话通这个给service.get()。execute函数。

基本上我的最终目标是在我的应用程序中,我将一个XML文件上传到Google Drive,然后再下载文件。它只会是一个文件,并且将始终具有相同的名称。我是否立即着手或者有更好的方法来实现我正在尝试做的事情。

我希望这是有道理的,任何帮助将不胜感激。

感谢

回答

2

嗯,我能想到的第一个选择是,你可以用search parameters发送list的要求为您的文件,像title="File_1.xml" and fileExtension="xml"。它会返回一个空的文件列表(没有一个匹配serach条件),或者返回一个至少包含一个文件的列表。如果只有一个 - 很简单。但是如果还有更多 - 你必须根据其他一些领域选择其中的一个。请记住,在gdrive中,您可以拥有多个具有相同名称的文件。所以你提供的搜索参数越多越好。

+0

感谢您的帮助,这似乎是很多工作,告诉android获取所有文件的列表,然后遍历所有文件,找到我想要的文件,以便我可以获得ID。期望只提供一个文件名,并检索该ID。谢谢,虽然我会试试 – Boardy 2013-02-25 13:33:06

+0

你实际上并没有告诉android来做它,而是谷歌的服务器。通过这种方式,他们的服务器正在完成您的工作(从(可能很长的)文件列表中筛选正确的文件)。另外,通过网络传输的数据更少。 – stan0 2013-02-25 13:42:35

+0

是的,我看到你的观点,只是看起来很慢,很长时间啰嗦,当我列表找到文件ID是为我的测试,在问题中提到它花了几秒钟完成,我不是那么过分我的云端硬盘帐户中有大量文件 – Boardy 2013-02-25 18:22:57

1

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

当你第一次将文件上传到Google云端硬盘存储其ID(在SharedPreferences是可能比较容易),供以后使用

即。

file= mDrive.files().insert(body).execute();  //initial insert of file to google drive 

whereverYouWantToStoreIt= file.getId(); //now you have the guaranteed unique id 
             //of the file just inserted. Store it and use it 
             //whenever you need to fetch this file 
1

如果知道该文件的名称,如果你总是想要下载特定文件,那么你就可以轻松获得ID和其他属性从你想要的档案:https://developers.google.com/drive/v2/reference/files/list(朝向底部,你会找到一种运行查询的方式)。在q字段中输入title ='your_file_name'并运行它。你应该看到一些结果显示在下面,它应该是一个“ID”字段。这是你正在寻找的身份证。

您也可以玩与其他参数:https://developers.google.com/drive/search-parameters

2

该脚本记录在驱动所有的文件名和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()); 
    } 
} 

此外,“Files: list”的页面在一个表格列出驱动器中所有文件的元数据的结尾,可用于需要但少数ID的情况。

3

一种方法是在创建时将独特的属性与您的文件相关联。

properties = "{ \ 
    key='somekey' and \ 
    value='somevalue' 
}" 

然后创建一个查询。

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

已知的所有文件属性(标题等)可以在这里+属性。

0

对于我的观点,获取Google云端硬盘文件ID的最简单快捷的方法是从Google Drive网络中,右键单击文件,然后单击获取共享链接。链接的最后部分是文件ID。然后你可以取消分享。

相关问题