最適なユーザー エクスペリエンスを実現するには、ユーザーの初回ログイン時にリクエストするスコープをできるだけ少なくする必要があります。アプリのコア機能が 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();
}
}
}
GoogleSignInOptionsExtension
を hasPermissions
と requestPermissions
に渡して、権限セットの確認と取得を簡単に行うこともできます。