-1

我在我的应用程序中使用GDAA来管理我在谷歌驱动器中的应用程序文件。所有下面列出的操作精细的工作就像无法覆盖Google Drive AppData文件夹中的文件INTERNAL_ERROR

  • 谷歌从AppData Folder
  • 上传文件到AppData Folder
  • 删除文件
  • 下载文件从AppData Folder
(范围为AppData的文件夹添加)登录

,但是当我尝试覆盖文件中AppData Folder我是得到出现错误onResult()回调中。

Status Message : Failed to commit changes. 
Status Code : INTERNAL_ERROR (8) 

我无法理解为什么会发生这种情况。请在下面找到我的代码以供参考

public void overwrite(String strLocalFilePath, String strDriveId, String strGoogleDriveFileMimeType, String strGoogleDriveFileTitle){ 
    final DriveId driveId = DriveId.decodeFromString(strDriveId); 
    DriveFile file = driveId.asDriveFile(); 

    file.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() { 
     @Override 
     public void onResult(DriveApi.DriveContentsResult result) { 
      if (!result.getStatus().isSuccess()) { 
       Log.e(TAG,"Error"); 
       return; 
      } 

      DriveContents driveContents = result.getDriveContents(); 
      OutputStream outputStream = driveContents.getOutputStream(); 
      boolean isSuccess = writeFileToStream(outputStream, strLocalFilePath); 

      if (isSuccess) { 
       MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
         .setTitle(strGoogleDriveFileTitle) 
         .setMimeType(strGoogleDriveFileMimeType) 
         .build(); 

       ExecutionOptions executionOptions = new ExecutionOptions.Builder() 
         .setNotifyOnCompletion(true) 
         .setTrackingTag("SAMPLE_TRACKING_TAG") 
         .build(); 

       driveContents.commit(mGoogleApiClient, changeSet, executionOptions).setResultCallback(new ResultCallback<Status>() { 
        @Override 
        public void onResult(Status status) { 
         // Handle the response status 
         if (!status.getStatus().isSuccess()) { 
          Log.e(TAG, "Error while trying to overwrite file. Message : "+status.getStatus().getStatusMessage() + " Status code : "+status.getStatus().getStatusCode()); 
          return; 
         }else{ 
          Log.d(TAG,"File overwritten successfully!!"); 
         } 

        } 
       }); 
      } else { 
       Log.e(TAG, "File I/O Error occurred : "+ strGoogleDriveFileTitle); 
      } 
     } 
    }); 
} 

private boolean writeFileToStream (OutputStream oos, String filePath){ 
    if (oos != null) { 
     InputStream is = null; 
     try { 
      Log.d(TAG, "Started writing file : "+filePath); 
      is = new FileInputStream(filePath); 
      byte[] buf = new byte[4096]; 
      int c; 
      while ((c = is.read(buf, 0, buf.length)) > 0) { 
       oos.write(buf, 0, c); 
       oos.flush(); 
      } 
      Log.d(TAG, "Finished writing file : "+filePath); 
      return true; 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      return false; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } finally { 
      try { 
       if(oos != null) { 
        oos.close(); 
       } 
       if(is != null){ 
        is.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 
    } 
    return false; 
} 

回答

0

根据这一thread,如果你得到错误代码为8(INTERNAL_ERROR),请仔细检查你的应用程序中的注册开发者控制台。请注意,每个注册的Android客户端都由(包名称,Android签名证书SHA-1)对唯一标识。如果您的调试和生产环境中有多个软件包名称/签名证书,请确保注册每对软件包。

验证:

  1. 打开Credentials page和选择项目
  2. 确保每对有的Android类型的OAuth 2.0客户端ID。 要为您的Android客户端创建一个新的OAuth 2.0客户端ID,选择新凭证 - 从下拉>OAuth2用户端编号,选择Android和输入你的包名称/签名证书指纹那里。

为了让您的签名密钥证书SHA-1:关键

标准调试关键

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 

其他(自定义)

keytool -list -v -keystore $YOUR_KEYSTORE_LOCATION 

这里有一个REF erence这也可能有助于:

如果你连1之后得到这个错误)确保您已注册,其相应的证书指纹的包名,和2) (重新)使用一个已经存在的项目,那么你应该检查这个项目是否有一个产品名称和一个电子邮件地址(仔细检查一下),它们都可以在“同意屏幕”部分找到。