【问题标题】:Upload file to google drive fails将文件上传到谷歌驱动器失败
【发布时间】:2014-09-17 19:36:52
【问题描述】:

将文件从 android 上传到 Google 驱动器失败。即使返回的状态是成功,似乎createFile 也不起作用。我从 Google API 获得的实际状态错误代码和消息是错误代码 8,错误消息:Provided DriveId is not valid

我也无法在相关用户 Google 驱动器上找到该文件(使用 Google 驱动器的 Web 界面)。

我也尝试在创建文件回调中使用Drive.DriveApi.fetchDriveId(m_api, m_file.getDriveId().toString())(而不是调用openContents),它也失败了。

相关代码如下,任何帮助将不胜感激!

public void createFile() {
  Drive.DriveApi.newContents(m_api).setResultCallback(contentsCallback);
}

final private ResultCallback<ContentsResult> contentsCallback = new ResultCallback<ContentsResult>() {
  @Override
  public void onResult(ContentsResult result) {
    if (handleError(result.getStatus())) {
      return;
    }

    Contents contents = result.getContents();
    MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
        .setTitle("aaab").setMimeType("text/plain")
        .setStarred(true).build();

    // create a file on root folder
    Drive.DriveApi.getRootFolder(m_api)
        .createFile(m_api, changeSet, contents)
        .setResultCallback(fileCallback);
  }

};

final private ResultCallback<DriveFileResult> fileCallback = new ResultCallback<DriveFileResult>() {
  @Override
  public void onResult(DriveFileResult result) {
    if (handleError(result.getStatus())) {
      return;
    }
    m_file = result.getDriveFile();

    m_file.openContents(m_api, DriveFile.MODE_READ_ONLY, null)
        .setResultCallback(updateCallback);
  }
};

final private ResultCallback<ContentsResult> updateCallback = new ResultCallback<ContentsResult>() {
  @Override
  public void onResult(ContentsResult result) {
    // Getting error here
    if (handleError(result.getStatus())) {
      return;
    }

...

【问题讨论】:

    标签: android google-drive-api


    【解决方案1】:

    好的问题是没有创建新文件。 为了在 GoogleDrive 上创建新文件,我使用此代码并且工作正常,问题出在您的 googleapiclient 中,或者我不知道您在哪里以及如何调用您的函数 createFile()。您必须调用 onConnected 方法。

    @Override
    public void onConnected(Bundle connectionHint) {
        super.onConnected(connectionHint);
        // create new contents resource
        Drive.DriveApi.newContents(m_api)
                .setResultCallback(contentsCallback);
    }
    
    final private ResultCallback<ContentsResult> contentsCallback = new
            ResultCallback<ContentsResult>() {
        @Override
        public void onResult(ContentsResult result) {
            if (!result.getStatus().isSuccess()) {
                showMessage("Error while trying to create new file contents");
                return;
            }
    
            MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                    .setTitle("New file")
                    .setMimeType("text/plain")
                    .setStarred(true).build();
            // create a file on root folder
            Drive.DriveApi.getRootFolder(m_api)
                    .createFile(m_api, changeSet, result.getContents())
                    .setResultCallback(fileCallback);
        }
    };
    
    final private ResultCallback<DriveFileResult> fileCallback = new
            ResultCallback<DriveFileResult>() {
        @Override
        public void onResult(DriveFileResult result) {
            if (!result.getStatus().isSuccess()) {
                showMessage("Error while trying to create the file");
                return;
            }
            showMessage("Created a file: " + result.getDriveFile().getDriveId());
        }
    };
    

    【讨论】:

    • fileCallback 为成功,getStatus().isSuccess() 为真。但是,似乎没有创建该文件,因为我在 Google 驱动器中看不到它。此外,尝试处理文件的下一个命令(例如 openContentsfetchDriveId)返回访问文件的错误
    【解决方案2】:

    我已经解决了! 它有两个问题:

    第一个问题是我的错 - 我的 android manifest 缺少驱动服务的 APP_ID:

    <meta-data
        android:name="com.google.android.apps.drive.APP_ID"
        android:value="@string/app_id" />
    

    其次,该活动扩展了预定义的 Google 类:BaseGameActivity。 但是这个类假设我没有使用谷歌驱动器文件。为了让它工作,我必须在我的活动中添加这个:

        mRequestedClients = GameHelper.CLIENT_ALL;
    

    并更改 Google 预定义代码。实际上它看起来像谷歌的一个错误,假设总是使用谷歌APP文件夹,而不是谷歌驱动器文件。在 GameHelper.java 中,第 298 行,来自:

    builder.addScope(Drive.SCOPE_APPFOLDER);
    

    到:

    builder.addScope(Drive.SCOPE_FILE);
    

    【讨论】:

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