【问题标题】:Download selected file from Google drive从 Google 云端硬盘下载选定的文件
【发布时间】:2015-08-02 09:56:44
【问题描述】:

我有所选文件的驱动器 ID,我可以使用

获取该文件的 URL
MetadataResult mdRslt;
        DriveFile file;
    file = Drive.DriveApi.getFile(mGoogleApiClient,driveId);
                mdRslt = file.getMetadata(mGoogleApiClient).await();
                if (mdRslt != null && mdRslt.getStatus().isSuccess()) {
                    link = mdRslt.getMetadata().getWebContentLink();
                    if(link==null){
                        link = mdRslt.getMetadata().getAlternateLink();
                        Log.e("LINK","FILE URL After Null: "+ link);
                    }
                    Log.e("LINK","FILE URL : "+ link);
                }

如何从 url 下载文件并保存到 SD 卡?请帮助我解决这个问题。 谢谢。

【问题讨论】:

    标签: android google-drive-api google-drive-android-api


    【解决方案1】:

    更新:
    实际上,由于您将其写入文件,因此不需要“is2Bytes()”。只需将输入流 (cont.getInputStream()) 直接转储到文件中即可。

    原始答案:
    由于您指的是GDAA,因此此方法(taken from here)可能适合您:

      GoogleApiClient mGAC;
    
      byte[] read(DriveId id) {
        byte[] buf = null;
        if (mGAC != null && mGAC.isConnected() && id != null) try {
          DriveFile df = Drive.DriveApi.getFile(mGAC, id);
          DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await();
          if ((rslt != null) && rslt.getStatus().isSuccess()) {
            DriveContents cont = rslt.getDriveContents();
            buf = is2Bytes(cont.getInputStream());
            cont.discard(mGAC);    // or cont.commit();  they are equiv if READONLY
          }
        } catch (Exception e) { Log.e("_", Log.getStackTraceString(e)); }
        return buf;
      }
    
      byte[] is2Bytes(InputStream is) {
        byte[] buf = null;
        BufferedInputStream bufIS = null;
        if (is != null) try {
          ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
          bufIS = new BufferedInputStream(is);
          buf = new byte[4096];
          int cnt;
          while ((cnt = bufIS.read(buf)) >= 0) {
            byteBuffer.write(buf, 0, cnt);
          }
          buf = byteBuffer.size() > 0 ? byteBuffer.toByteArray() : null;
        } catch (Exception ignore) {}
        finally {
          try {
            if (bufIS != null) bufIS.close();
          } catch (Exception ignore) {}
        }
        return buf;
      }
    

    它是 'await' 风格的简化版本,已在 UI 线程外运行。另外,将输入流转储到缓冲区是可选的,我不知道你的 应用程序的需求是。

    祝你好运。

    【讨论】:

    • 感谢您的回复。我试过这个。某些选定的文件输入流返回 null。我注意到它发生在 metadata.getFileExtension() 返回 null 的情况下。如果它返回正确的扩展名,如 png、docx,那么我可以获取它的输入流并下载该文件。请就此向我提出建议。谢谢。
    • “选定文件”的概念太模糊,无法弄清楚您的问题是什么。考虑另一个带有代码示例的 SO 问题。您上面的代码以 DriveId 开头,这并不表明您是如何获得它的。但请记住,文件扩展名没有任何意义,请查看文件/文件夹的 MIMETYPE。
    【解决方案2】:

    使用 downloadUrl 或其中一个 exportLinks。有关这些属性的说明,请参阅 https://developers.google.com/drive/v2/reference/files

    【讨论】:

    • 我给了他一个 GDAA 版本以减少混淆。将两者混合使用可能会对他的应用程序的健康造成危险。
    猜你喜欢
    • 2016-08-09
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多