请求其他范围

为提供最佳用户体验,您应在用户首次登录时尽可能少请求权限范围。如果应用的核心功能未与 Google 服务相关联,那么在登录时,您通常只需 GoogleSignInOptions.DEFAULT_SIGN_IN 配置即可。

如果您的应用具有可使用 Google API 数据的功能,但这些功能不是应用核心功能的必需组成部分,那么您应在设计应用时考虑到无法访问 API 数据的情况,并能妥善处理此类情况。例如,如果用户未授予云端硬盘访问权限,您可以隐藏最近保存的文件列表。

只有在用户执行需要访问特定 API 的操作时,您才应请求访问 Google API 所需的其他范围。例如,您可以仅在用户首次点按“保存到云端硬盘”按钮时请求访问用户的云端硬盘。

通过使用此方法,您可以避免让新用户感到不堪重负,或让用户对您请求他们提供某些权限的原因感到困惑。

请求用户操作所需的权限

每当用户执行需要在登录时未请求的范围的操作时,请调用 GoogleSignIn.hasPermissions 以检查用户是否已授予所需权限。否则,请调用 GoogleSignIn.requestPermissions 以启动一个 activity,以便向用户请求其他必需范围。

例如,如果用户执行的操作需要访问其云端硬盘应用存储空间,请执行以下操作:

if (!GoogleSignIn.hasPermissions(
        GoogleSignIn.getLastSignedInAccount(getActivity()),
        Drive.SCOPE_APPFOLDER)) {
    GoogleSignIn.requestPermissions(
            MyExampleActivity.this,
            RC_REQUEST_PERMISSION_SUCCESS_CONTINUE_FILE_CREATION,
            GoogleSignIn.getLastSignedInAccount(getActivity()),
            Drive.SCOPE_APPFOLDER);
} else {
    saveToDriveAppFolder();
}

在 activity 的 onActivityResult 回调中,您可以检查是否已成功获取所需权限,如果已成功获取,则执行用户操作。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (RC_REQUEST_PERMISSION_SUCCESS_CONTINUE_FILE_CREATION == requestCode) {
            saveToDriveAppFolder();
        }
    }
}

您还可以将 GoogleSignInOptionsExtension 传递给 hasPermissionsrequestPermissions,以更方便地检查和获取一组权限。