Google Play Games の 実績アンロック時ポップアップが表示されなかった原因と解決策

Google Play Games対応のゲームを作っていて、実績をアンロックした際に表示されるはずのポップアップが出なくてハマったことのメモです。

広告

参考にしたのは公式のサンプルアプリ

https://github.com/playgameservices/android-basic-samples

上記の「TypeANumber」を参考に作成しました。

ある程度作り込み、アチーブメントのアンロックはできるが自動で表示されるはずのポップアップが表示されないことに気づきました。

原因1:実装が足りない

ポップアップを出すための実装が足りませんでした。
ネットで調べると同じ問題で悩んでいる人が多く、解決策がすぐに見つかりました。

解決策

1.アクティビティのレイアウトにポップアップ表示用の枠を追加します。

<FrameLayout
    android:id="@+id/game_popup_area"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">
</FrameLayout>

2.上記のポップアップ表示枠を、GameClientに設定する

private fun onConnected(googleSignInAccount: GoogleSignInAccount) {
    val gameClient = Games.getGamesClient(this, googleSignInAccount)
    gameClient.setViewForPopups(findViewById(R.id.game_popup_area))

設定するタイミングは、サインイン後です。

原因2:ポップアップ表示枠の配置がまずかった

原因1の解決策で解決するはずだったのに何故か表示されませんでした。

解決策

どうやら「wrap_content」で適当に置いたのがダメだったようです。
親要素いっぱいに広げて配置したら表示されるようになりました。

<FrameLayout
    android:id="@+id/game_popup_area"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">
</FrameLayout>
google_play_games_popup
ちゃんと配置できていると、サインイン時にもポップアップが出ます。

最後に

公式サンプルアプリに「実績アンロック時のポップアップは自動で出るから実装しなくていいよ」と書いてあるけど丸っと信じてはいけなかった。

google_play_games_popup_need_show_own
サンプル

以上。