请求更多作用域

为获得最佳用户体验,您在首次登录用户时应请求尽可能少的作用域。如果您的应用的核心功能不与 Google 服务绑定,通常只需在登录时使用 GoogleSignInOptions.DEFAULT_SIGN_IN 配置即可。

如果您的应用包含可以使用 Google API 数据的功能,但这些功能并非应用核心功能的必要部分,则应设计您的应用,使其能够优雅地处理 API 数据无法访问的情况。例如,当用户未授予 Drive 访问权限时,您可以隐藏最近保存的文件列表。

您应仅在用户执行需要访问特定 API 的操作时,请求访问 Google API 所需的额外作用域。例如,您可以在用户首次点击“保存到 Drive”按钮时,才请求访问用户 Drive 的权限。

通过使用此技术,您可以避免给新用户带来困扰,或使用户对被要求授予某些权限感到困惑。

请求用户操作所需的权限

每当用户执行需要未在登录时请求的作用域的操作时,调用 GoogleSignIn.hasPermissions 检查用户是否已授予所需的权限。如果未授予,则调用 GoogleSignIn.requestPermissions 启动一个活动,向用户请求额外的所需作用域。

例如,如果用户执行需要访问其 Drive 应用存储的操作,请执行以下操作:

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,以更方便地检查和获取一组权限。