无法覆盖Google云端硬盘AppData文件夹中的文件INTERNAL_ERROR

时间:2017-03-09 21:48:24

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

我在我的应用程序中使用GDAA来管理Google云端硬盘中的应用程序文件。下面列出的所有操作都可以正常工作,如

  • google登录(为AppData文件夹添加范围)
  • AppData Folder
  • 下载文件
  • 将文件上传到AppData Folder
  • AppData Folder
  • 删除文件

但是当我尝试覆盖 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;
}

1 个答案:

答案 0 :(得分:0)

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

  

验证:

     
      
  1. 打开Credentials page并选择您的项目
  2.   
  3. 确保每对都有 Android 类型的OAuth 2.0客户端ID。   要为您的Android客户端创建新的OAuth 2.0客户端ID,请从下拉列表中选择新凭据 - > OAuth2客户端ID ,然后选择Android并输入您的包名称/签名 - 那里的证书指纹。
  4.         

    获取签名密钥证书SHA-1:

         

    标准调试密钥

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

    其他(自定义)密钥

    keytool -list -v -keystore $YOUR_KEYSTORE_LOCATION
    

这是一个可能也有帮助的参考:

  

如果你在1)确保你已经用相应的证书指纹注册了包名,并且2)(重新)使用已经存在的项目之后你就会收到这个错误,那么你应该检查这个项目是否有产品名称和与之关联的电子邮件地址(仔细检查一下),均可在“同意屏幕”部分找到。