追加のスコープをリクエストする

最適なユーザー エクスペリエンスを実現するには、ユーザーの初回ログイン時にリクエストするスコープをできるだけ少なくする必要があります。アプリのコア機能が Google サービスに関連付けられていない場合、ログイン時に必要なのは GoogleSignInOptions.DEFAULT_SIGN_IN 構成のみであることがよくあります。

アプリに Google API データを利用できる機能があるものの、アプリのコア機能の一部として必須ではない場合は、API データにアクセスできない場合を適切に処理できるようにアプリを設計する必要があります。たとえば、ユーザーがドライブへのアクセスを許可していない場合、最近保存したファイルのリストを非表示にできます。

Google API にアクセスするために必要な追加のスコープは、ユーザーが特定の API へのアクセスを必要とするアクションを実行した場合にのみリクエストする必要があります。たとえば、ユーザーが [ドライブに保存] ボタンを初めてタップしたときにのみ、ユーザーのドライブへのアクセス権限をリクエストできます。

この手法を使用すると、新規ユーザーに負担をかけたり、特定の権限を要求される理由についてユーザーが混乱したりすることを防ぐことができます。

ユーザー アクションに必要な権限をリクエストする

ユーザーがログイン時にリクエストされていないスコープを必要とするアクションを実行するたびに、GoogleSignIn.hasPermissions を呼び出して、ユーザーが必要な権限をすでに付与しているかどうかを確認します。そうでない場合は、GoogleSignIn.requestPermissions を呼び出して、ユーザーに追加の必要なスコープをリクエストするアクティビティを起動します。

たとえば、ユーザーがドライブ アプリのストレージへのアクセスを必要とする操作を行った場合は、次の手順を行います。

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();
}

アクティビティの 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();
        }
    }
}

また、GoogleSignInOptionsExtensionhasPermissions に、requestPermissionsrequestPermissions に渡して、権限のセットをより簡単に確認して取得することもできます。