为提供最佳用户体验,您应在用户首次登录时请求尽可能少的范围。如果应用的核心功能与 Google 服务无关,那么登录时通常只需要 GoogleSignInOptions.DEFAULT_SIGN_IN 配置。
如果您的应用具有可以利用 Google API 数据的功能,但这些功能并非应用核心功能的一部分,您应将应用设计为能够妥善处理无法访问 API 数据的情况。例如,当用户未授予云端硬盘访问权限时,您可能会隐藏最近保存的文件列表。
您应仅在用户执行需要访问特定 API 的操作时,才请求访问 Google API 所需的其他范围。例如,您可能仅在用户首次点按“保存到云端硬盘”按钮时,才请求访问用户云端硬盘的权限。
使用此技巧,您可以避免让新用户感到不知所措,或让用户对系统要求其提供某些权限的原因感到困惑。
请求用户操作所需的权限
每当用户执行需要登录时未请求的范围的操作时,请调用 GoogleSignIn.hasPermissions 以检查用户是否已授予所需的权限。如果不是,请调用 GoogleSignIn.requestPermissions 以启动一个 activity,该 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 传递给 hasPermissions 和 requestPermissions,以便更方便地检查和获取一组权限。