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

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

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

ユーザーが特定の API へのアクセスを必要とするアクションを実行する場合にのみ、Google 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();
        }
    }
}

GoogleSignInOptionsExtensionhasPermissionsrequestPermissions に渡して、一連の権限を簡単に確認および取得することもできます。