当前位置: 首页 > 知识库问答 >
问题:

如何使用Drive.api从Google Drive下载文件?

斜和硕
2023-03-14
  final GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE));
    credential.setSelectedAccountName(accountName);
    service = new com.google.api.services.drive.Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential).build();

    Query query = new Query.Builder()
            .addFilter(Filters.eq(SearchableField.TITLE, "BackupFile"))
            .build();


    final DriveFolder folder = Drive.DriveApi.getRootFolder(mGoogleApiClient);
    folder.queryChildren(mGoogleApiClient, query).setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
        @Override
        public void onResult(DriveApi.MetadataBufferResult metadataBufferResult) {
            final MetadataBuffer metadataBuffer = metadataBufferResult.getMetadataBuffer();
            int iCount = metadataBuffer.getCount();

            if (iCount == 1) {
                Log.i("Tag", "file was found");
                final DriveId myFileId = metadataBuffer.get(0).getDriveId();
                final DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, myFileId);

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        DriveResource.MetadataResult mdRslt = file.getMetadata(mGoogleApiClient).await();
                        if (mdRslt != null && mdRslt.getStatus().isSuccess()) {
                            String link = mdRslt.getMetadata().getWebContentLink();
                            Log.d("TAG", "Link to File:" + link);
                             DownloadBackup(link);
                        }
                    }
                }).start();

            }
            metadataBuffer.release();
        }
    });
public void DownloadBackup(String url){
        InputStream mInput=null;
        FileOutputStream mOutput=null;
        if(url != null && url.length() > 0 ){
        try {
                GoogleAccountCredential crd = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE_FILE));
                crd.setSelectedAccountName(accountName);
                com.google.api.services.drive.Drive srv = new com.google.api.services.drive.Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), crd).build();
                mInput = srv.getRequestFactory().buildGetRequest(new GenericUrl(url)).execute().getContent();
                String outFileName = getApplicationContext().getDatabasePath(DatabaseHandler.DATABASE_NAME).getPath();
                mOutput = new FileOutputStream(outFileName);
                byte[] mBuffer = new byte[1024];
                int mLength;
                while ((mLength = mInput.read(mBuffer)) > 0) {
                    mOutput.write(mBuffer, 0, mLength);
                }
                mOutput.flush();
                Log.d("TAG", "Successfully Downloaded contents");
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    //Close the streams
                    if(mOutput != null){
                        mOutput.close();
                    }
                    if(mInput != null){
                        mInput.close();
                    }
                } catch (IOException e) {
                    Log.e("Tag", "failed to close databases");
                }
            }
        } else {
            // The file doesn't have any content stored on Drive.
            // return null;
            Log.e("Tag", "No content on Drive");
        }
    }
W/System.err﹕ com.google.api.client.http.HttpResponseException: 401 Unauthorized
W/System.err﹕ <HTML>
W/System.err﹕ <HEAD>
W/System.err﹕ <TITLE>Unauthorized</TITLE>
W/System.err﹕ </HEAD>
W/System.err﹕ <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
W/System.err﹕ <H1>Unauthorized</H1>
W/System.err﹕ <H2>Error 401</H2>
W/System.err﹕ </BODY>
W/System.err﹕ </HTML>
W/System.err﹕ [ 06-12 11:01:05.447 26208:26236 W/System.err ]
        at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1061)
W/System.err﹕ at com.example.app.activities.Main.DownloadBackup(Main.java:487)
W/System.err﹕ at com.example.app.activities.Main$15$1.run(Main.java:332)
W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

共有1个答案

公良莫希
2023-03-14

以下是我如何成功地做到这一点。我没有保存'Get WebContentLink'的结果,而是保存了一个文件/文件夹ID(它是一个字符串)。并将此ID传递给如下方法:

 /*************************************************************************
   * get file contents
   * @param resId  file driveId
   * @return       file's content  / null on fail
   */
  static InputStream read(String resId) {
    if (mGOOSvc != null && mConnected && resId != null) try {
      File gFl = mGOOSvc.files().get(resId).setFields("downloadUrl").execute();
      if (gFl != null){
        String strUrl = gFl.getDownloadUrl();
        return mGOOSvc.getRequestFactory()
        .buildGetRequest(new GenericUrl(strUrl)).execute().getContent();
      }
    } catch (Exception e) { /* error handling */ }
    return null;
  }

检索“downloadURL”并获取内容。此方法的完整上下文可以在这里看到。

祝你好运

 类似资料:
  • > 假设我有一个导出链接,如下所示:

  • 问题内容: 在我的应用程序中,在客户端创建了一个json对象。该对象被发布到HttpServlet,后者基于POST数据创建pdf文件。 该文件将发送回用户。调用成功函数,并记录流数据。但是,我想要下载该文件。 如何实现呢? 我的客户端代码: }); 然后servlet创建文件: 日志中的输出: 我的解决方案:* 有关指针,请参见http://www.particletree.com/notebo

  • 我正在使用Qt框架编写一个C应用程序,该应用程序需要从源锻造下载文件。 我必须下载这个文件https://sourceforge.net/projects/meshlab/files/updates/1.3.3/updates.xml 我使用Qt和QHttp类编写了以下代码: QHttp::设置主机和 QHttp::获取都不会阻止函数立即返回一个整数 ID。当 http 文件传输完成后,将自动调用

  • 我试图创建一个nodejs应用程序,可以准备我的GoogleDrive文件。我不想要一个每个人都可以使用的应用程序,它只是特定于我的谷歌驱动。 我在控制台中为GoogleDrive创建了一个api密钥,没有任何限制。 这是我正在做的电话:https://www.googleapis.com/drive/v3/files?pageSize=10 当使用这个键我得到这个错误: 这在谷歌硬盘上可能吗?

  • 问题内容: 我需要将文件从服务器下载到桌面。(UBUNTU 10.04)我没有Web访问服务器,只是ssh。 如果有帮助,我的操作系统是Mac OS X和iTerm 2作为终端。 问题答案: 在您的终端中,键入: 相应地替换用户名,主机,远程文件名和本地目录。 如果要访问EC2(或其他需要使用私钥进行身份验证的服务),请使用以下选项:

  • 问题内容: 我正在开发一个应用程序,为用户提供一个界面,用户可以在其中从我们的Google Cloud Storage下载文件。我编写了单元测试,可以连接到存储并下载了一个文件。 现在,我(几乎)完成了界面,我想测试整个应用程序。但是现在我注意到我并没有真正下载文件,而是下载了包含有关要下载文件的META数据的文件。就像是: 我想知道我在做什么错,这是我用来下载文件的代码: 问题答案: 如您所说,