【问题标题】:How do I upload file to google drive from android如何从android将文件上传到谷歌驱动器
【发布时间】:2014-02-05 06:09:59
【问题描述】:

我花了一天多的时间,但没有得到任何可行的解决方案,可以让我将文件上传/下载到Google Drive

我尝试了Google Play Service,但我没有找到任何上传/下载文件的方法。

我尝试了谷歌客户端库,但有一些方法没有解决。

如:

service.files().insert(body, mediaContent).execute();
errors: The method execute() is undefined for the type Drive.Files.Insert

我可以通过以下代码上传图片,但这是 Google Drive 文件上传器。我一次只能上传一个文件。

mFile = new java.io.File(fileList.get(i));
                Log.i(TAG, "Creating new contents.");
                Drive.DriveApi.newContents(mGoogleApiClient).addResultCallback(
                        new OnNewContentsCallback() {

                            @Override
                            public void onNewContents(ContentsResult result) {

                                if (!result.getStatus().isSuccess()) {
                                    Log.i(TAG, "Failed to create new contents.");
                                    return;
                                }

                                Log.i(TAG, "New contents created.");

                                OutputStream outputStream = result
                                        .getContents().getOutputStream();

                                byte[] byteStream = new byte[(int) mFile
                                        .length()];
                                try {
                                    outputStream.write(byteStream);
                                } catch (IOException e1) {
                                    Log.i(TAG, "Unable to write file contents.");
                                }

                                MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
                                        .setMimeType("image/jpeg")
                                        .setMimeType("text/html")
                                        .setTitle("Android Photo.png").build();
                                // Create an intent for the file chooser, and
                                // start it.
                                IntentSender intentSender = Drive.DriveApi
                                        .newCreateFileActivityBuilder()
                                        .setInitialMetadata(metadataChangeSet)
                                        .setInitialContents(
                                                result.getContents())
                                        .build(mGoogleApiClient);
                                try {
                                    mActivity.startIntentSenderForResult(
                                            intentSender, REQUEST_CODE_CREATOR,
                                            null, 0, 0, 0);
                                    publishProgress(1);
                                } catch (SendIntentException e) {
                                    Log.i(TAG, "Failed to launch file chooser.");
                                    publishProgress(0);
                                }
                            }
                        });

但仍在为下载文件而战。

【问题讨论】:

  • 嗨,MD,这与代码无关。实际上问题是我应该使用 Google Play 服务或 Google 提供的客户端库。如果我使用库,那么我们不能使用 Google Play 服务,因为某些文件被交叉,例如 Drive 类。它在图书馆和 Google Play 服务中。如果我使用的是 Google Play 服务,那么我不知道任何上传下载方法。
  • 感谢@Praveen,但如果未安装驱动应用程序会发生什么。我正在将 Google Drive 合并到我的应用中。实际上我正在合并 Dropbox、Google Drive、SkyDrive、Amazon 等。
  • @MD,我认为我们不应该同时使用库 Google Play 服务和 Google 客户端库,还是应该使用?
  • @PKTomar 你绝对正确。我遇到了同样的问题

标签: android google-drive-api


【解决方案1】:

我得到了解决方案。我们不应该使用 Android API 来获得完整的云端硬盘访问权限。我们应该使用纯 Java 代码,因为 Google 也说过要访问 Drive 以进行广泛访问,请使用 Java 库。

我删除了所有与 Google Play 服务相关的代码。我现在完全使用java,可以轻松上传、删除、编辑、下载所有我想要的东西。

Google doc 没有提供关于 Google Drive 与 android api 相关的详细描述,而在使用 java 库时,您可以获得已经创建的方法等等。

我没有提供任何代码,只是说我或其他对 Drive 完全访问感兴趣的人使用基于 Java 的代码。

【讨论】:

  • 对不起兄弟,我现在没有任何代码 sn-p 实际上那是我的公司项目,我换了工作。但基本上那个时候google drive android api不能很好地工作,我做了很多google,最后我找到了一些java库(客户端库),然后我也开始添加、删除、上传文件和文件夹。
  • 嗨@PKTomar 你能帮我吗,因为我也遇到了很多关于谷歌驱动器下载文件的问题。我使用“谷歌播放服务”下载谷歌驱动器文件。您能否告诉我或提供有关您遵循的详细说明的任何链接?
【解决方案2】:

将文件上传到 Google 云端硬盘

Drive.Files.Insert insert;
try {
    final java.io.File uploadFile = new java.io.File(filePath);
    File fileMetadata = new File();
    ParentReference newParent = new ParentReference();
    newParent.setId(upload_folder_ID);
    fileMetadata.setParents(
            Arrays.asList(newParent));
    fileMetadata.setTitle(fileName);
    InputStreamContent mediaContent = new InputStreamContent(MIMEType, new BufferedInputStream(
                new FileInputStream(uploadFile) {
                    @Override
                    public int read(byte[] buffer,
                            int byteOffset, int byteCount)
                            throws IOException {
                        // TODO Auto-generated method stub
                        Log.i("chauster","progress = "+byteCount);
                        return super.read(buffer, byteOffset, byteCount);
                    }
                }));
            mediaContent.setLength(uploadFile.length());
    insert = service.files().insert(fileMetadata, mediaContent);
    MediaHttpUploader uploader = insert.getMediaHttpUploader();
    FileUploadProgressListener listener = new FileUploadProgressListener();
    uploader.setProgressListener(listener);
    uploader.setDirectUploadEnabled(true);
    insert.execute();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

public class FileUploadProgressListener implements MediaHttpUploaderProgressListener {

    @SuppressWarnings("incomplete-switch")
    @Override
    public void progressChanged(MediaHttpUploader uploader) throws IOException {
        switch (uploader.getUploadState()) {
            case INITIATION_STARTED:
                break;
            case INITIATION_COMPLETE:
                break;
            case MEDIA_IN_PROGRESS:
                break;
            case MEDIA_COMPLETE:
                break;
        }
    }
}

并从谷歌驱动器下载文件查看this

【讨论】:

  • Drive.Files.Insert 类型的 execute() 方法未定义。我正在使用 google-api-services-drive-v2-rev112-1.17.0-rc.jar。 jar有问题吗?
  • 我用的是google-api-services-drive-v2-rev109-1.15.0-rc.jar
  • 现在我正在使用 google-api-services-drive-v2-rev109-1.15.0-rc.jar 但没有方法执行,getMediaHttpUploader()。我还检查了 grep 代码的源代码。
  • FileUploadProgressListener 已添加,再次查看
  • 您的侦听器正常,但无法执行,以及 getMediaHttpUploader() 方法。库改了吗?
【解决方案3】:

Google SDK 现在对 Android 友好。有一个完全访问范围,可让您访问列出和读取所有驱动器文件,并且可以轻松地在 Android 应用程序中使用,因为我们的 newer client library 是 Android 友好的!我还建议观看 Google IO 的演讲,该演讲解释了如何将移动应用与云端硬盘集成

该库使身份验证更容易

 /** Authorizes the installed application to access user's protected data. */
  private static Credential authorize() throws Exception {
    // load client secrets
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
        new InputStreamReader(CalendarSample.class.getResourceAsStream("/client_secrets.json")));
    // set up authorization code flow
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, JSON_FACTORY, clientSecrets,
        Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory(dataStoreFactory)
        .build();
    // authorize
    return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
  } 

该库在 Google App Engine 上运行

媒体上传

class CustomProgressListener implements MediaHttpUploaderProgressListener {
  public void progressChanged(MediaHttpUploader uploader) throws IOException {
    switch (uploader.getUploadState()) {
      case INITIATION_STARTED:
        System.out.println("Initiation has started!");
        break;
      case INITIATION_COMPLETE:
        System.out.println("Initiation is complete!");
        break;
      case MEDIA_IN_PROGRESS:
        System.out.println(uploader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Upload is complete!");
    }
  }
}

File mediaFile = new File("/tmp/driveFile.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent);
request.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
request.execute();

您也可以使用可恢复的媒体上传功能,而无需使用特定于服务的生成库。这是一个例子:

File mediaFile = new File("/tmp/Test.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, transport, httpRequestInitializer);
uploader.setProgressListener(new CustomProgressListener());
HttpResponse response = uploader.upload(requestUrl);
if (!response.isSuccessStatusCode()) {
  throw GoogleJsonResponseException(jsonFactory, response);
}

【讨论】:

    【解决方案4】:

    我也试过这个,我正在寻找将一些用户数据上传到他们自己的帐户的教程。但我什么也没找到。 Google 建议使用 google firebase 存储而不是 google drive。如果您认为,WhatsApp 如何使用 google drive 上传数据。那么我的回答是,谷歌为 WhatsApp 提供了特殊服务。所以使用firebase存储,它很容易而且很便宜,而且还更新了。使用文档来非常正确地使用它们。文档真的很棒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多