如果我升级到 Gradle 插件 v3.5.0,Google Drive API 403 Forbidden 错误

Hal*_*erq 6 android google-drive-api gradle-plugin

我最近将 Gradle 插件从版本更新3.4.23.5.0.
用于访问云端硬盘文件列表的代码已停止工作。
我得到:403 Forbidden domain“:“usageLimits”,“原因”:“dailyLimitExceededUnreg”,“消息”:“已超出未经身份验证使用的每日限制。继续使用需要注册。”
如果我3.4.2再次使用它可以正常工作。

// Login
signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
            .build();
GoogleSignInClient client = GoogleSignIn.getClient(Backup.this, signInOptions);
startActivityForResult(client.getSignInIntent(), REQUEST_CODE_SIGN_IN);



@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (requestCode == REQUEST_CODE_SIGN_IN) {
        if (resultCode == Activity.RESULT_OK && resultData != null) {
            handleSignInResult(resultData);
        }
        ...
    }
super.onActivityResult(requestCode, resultCode, resultData);
}

private void handleSignInResult(Intent result) {
    GoogleSignIn.getSignedInAccountFromIntent(result)
    .addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
        @Override
        public void onSuccess(GoogleSignInAccount googleAccount) {
            // Use the authenticated account to sign in to the Drive service.
            GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(Backup.this, Collections.singleton(DriveScopes.DRIVE_FILE));
            credential.setSelectedAccount(googleAccount.getAccount());
            Drive googleDriveService =
                    new Drive.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new GsonFactory(),
                            credential)
                            .setApplicationName("MyAPP")
                            .build();

            mDriveServiceHelper = new BackupDriveServiceHelper(googleDriveService);

            // get info
            mDriveServiceHelper.readFileInfo()
                .addOnSuccessListener(new OnSuccessListener<Bundle>() {
                    ...
                })
                .addOnFailureListener(new OnFailureListener() {
                    ...
                });
            ...
        }
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
        }
    });
}



public class BackupDriveServiceHelper {
    ...
    public Task<Bundle> readFileInfo() {
        return Tasks.call(mExecutor, new Callable<Bundle>() {
            @Override
            public Bundle call() throws Exception {
                // Retrieve the metadata as a File object.
                String pageToken = null;
                do {
                    FileList result = mDriveService.files().list()
                            .setSpaces("drive")
                            .setFields("files(id, name, size, modifiedTime, description)")
                            .setPageToken(pageToken)
                            .execute();     // <<<<< error 403
                    ...
                    pageToken = result.getNextPageToken();
                } while (pageToken != null);
                ...
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*uze 6

我发现在针对 Android 8 (API27) 时,如果我将其添加到项目 gradle.properties 中,我可以让 Google Drive 与 Gradle 3.5.0 一起使用

android.enableD8=false
Run Code Online (Sandbox Code Playgroud)

但是,在针对 Android 9 (API 28) 并将 android.support.* 替换为 androidx.* 后,我收到此警告:

The option 'android.enableD8' is deprecated and should not be used anymore. 
Run Code Online (Sandbox Code Playgroud)

问题又回来了。在我看来,D8 DEX 编译器导致了问题,但无法再禁用它?

我已为 D8 https://issuetracker.google.com/issues/140882055提交了错误报告

更新:Google 建议的解决方案确实有效:将其添加到 proguard-rules.pro 后,Google Drive 适用于 Gradle 5.4.1 和 Plugin 3.5.0

-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}
Run Code Online (Sandbox Code Playgroud)