web-dev-qa-db-ja.com

Playゲームサービスが起動時に自動的にサインインしないようにするにはどうすればよいですか?

GoogleはBaseGameUtilsライブラリを提供しており、 そのBaseGameActivityを拡張することをお勧めします 。ただし、このクラスは、ゲームが開始されるたびにゲームに自動的にサインインさせます。プレイヤーが自分のGoogleアカウントに接続したくない、または接続できない場合、ゲームの開始時に非常に時間がかかることがあります。

だから私はこの機能が欲しくありません。代わりに、サインインボタンを提供します。プレーヤーは、そのボタンをクリックしたときにのみ接続されます。 そしてその時点から、プレイヤーはゲームを開始するたびに、ボタンをクリックすることなく自動的にGoogleアカウントに接続されます。これどうやってするの?

28
Hải Phong

わかりました、デフォルトでは、自動サインインの最大回数はです。つまり、ユーザーが3回キャンセルした場合、アプリは二度と戻りません(アプリのデータを消去しない限り) )自動的にサインインします。GameHelper.Java

 // Should we start the flow to sign the user in automatically on startup? If so, up to
 // how many times in the life of the application?
 static final int DEFAULT_MAX_SIGN_IN_ATTEMPTS = 3;
 int mMaxAutoSignInAttempts = DEFAULT_MAX_SIGN_IN_ATTEMPTS;

また、この最大数を設定する機能も提供します

public void setMaxAutoSignInAttempts(int max) {
        mMaxAutoSignInAttempts = max;
}

したがって、自動サインインの試行がまったく必要ない場合、この関数を呼び出すだけです

これは、BaseGameActivityを拡張したくない場合です。

gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
gameHelper.enableDebugLog(true);
gameHelper.setup(this);
gameHelper.setMaxAutoSignInAttempts(0);

または、BaseGameActivityを拡張する場合

getGameHelper().setMaxAutoSignInAttempts(0);
44
Hải Phong

_GameHelper.Java_ファイルには、デフォルトでtrueに設定されているmConnectOnStartというブール属性があります。代わりにfalseに変更してください:

_boolean mConnectOnStart = false;
_

さらに、クラスの外部からこの属性を管理するためのメソッドが提供されています。

_// Not recommended for general use. This method forces the "connect on start"
// flag to a given state. This may be useful when using GameHelper in a 
// non-standard sign-in flow.
public void setConnectOnStart(boolean connectOnStart) {
    debugLog("Forcing mConnectOnStart=" + connectOnStart);
    mConnectOnStart = connectOnStart;
}
_

サインインプロセスをカスタマイズするには、上記の方法を使用できます。私の場合、あなたと同じように、初めて自動接続したくありません。しかし、ユーザーが以前にサインインした場合は、自動接続する必要があります。これを可能にするために、BaseGameActivityクラスにあるgetGameHelper()メソッドを次のように変更しました。

_public GameHelper getGameHelper() {
    if (mHelper == null) {
        mHelper = new GameHelper(this, mRequestedClients);
        mHelper.enableDebugLog(mDebugLog);

        googlePlaySharedPref = getSharedPreferences("GOOGLE_PLAY",
                Context.MODE_PRIVATE);
        boolean wasSignedIn = googlePlaySharedPref.getBoolean("WAS_SIGNED_IN", false);
        mHelper.setConnectOnStart(wasSignedIn);
    }
    return mHelper;
}
_

毎回、getGameHelper()メソッドがBaseGameActivityonStart()から呼び出されます。上記のコードでは、ユーザーが以前にサインインした場合に保持する共有設定を追加しました。その場合に応じてsetConnectOnStart()メソッドを呼び出しました。

最後に、ユーザーがサインインプロセスを開始した後、_"WAS_SIGNED_IN"_(または別の名前で定義した場合は何か)共有設定をtrueに設定することを忘れないでください。これは、BaseGameActivityクラスのonSignInSucceeded()メソッドで実行できます。

これがお役に立てば幸いです。幸運を。

10
osmangokalp

OnCreateからgetGameHelper().setConnectOnStart(false);を呼び出します

1

実際、Googleのコードは、2番目の段落で説明したとおりに機能します。

サインインボタンを提供したい。プレーヤーは、そのボタンをクリックしたときにのみ接続されます。そして、その時点から、プレイヤーはゲームを開始するたびに、ボタンをクリックすることなく、Googleアカウントに自動的に接続されます。これどうやってするの?

  1. Helper.setupメソッドはクライアントを作成します

  2. onStartは、自動サインインの内部ブール値を調べます。ユーザーが以前に接続されていた場合(およびユーザーがサインアウトしなかったか、切断時にエラーがなかった場合)、サインインの再確立を試みます。

  3. 成功した接続が開始された場合、beginUserInitiatedSignInは自動サインインブール値を設定します

  4. onStopは接続を正常に終了するだけで、ブール値はリセットしません

そのため、アプリの起動時にユーザーにサインインプロセスが表示される唯一の方法は、ボタンを押す前にbeginUserInitiatedSignInが何らかの方法で呼び出される場合です。

BeginUserInitiatedSignInがonStartメソッド内にないこと、また、サインインボタンがクリックされてユーザーがサインインしていない場合を除いて、他の手段を除いて呼び出されないことを確認してください。

 @Override
protected void onCreate(Bundle b) {
    super.onCreate(b);
    mHelper = new GameHelper(this);
    if (mDebugLog) {
        mHelper.enableDebugLog(mDebugLog, mDebugTag);
    }
    mHelper.setup(this, mRequestedClients, mAdditionalScopes);
}

@Override
protected void onStart() {
    super.onStart();
    mHelper.onStart(this);
}

@Override
protected void onStop() {
    super.onStop();
    mHelper.onStop();
}


protected void beginUserInitiatedSignIn() {
    mHelper.beginUserInitiatedSignIn();
}

BaseGameUtilクラスから

/ ** *ゲームの基本クラスの例。この実装は、GamesClientオブジェクトのセットアップとそのライフサイクルの管理を行います。サブクラスは、@ link {#onSignInSucceeded}および@link {#onSignInFailed}抽象メソッドをオーバーライドするだけで済みます。ユーザーがサインイン*ボタンをクリックしたときにサインインフローを開始するには、サブクラスは@link {#beginUserInitiatedSignIn}を呼び出す必要があります。デフォルトでは、このクラスはGamesClientオブジェクトのみをインスタンス化します。 PlusClientまたはAppStateClientオブジェクトも必要な場合は、BaseGameActivity(int)*コンストラクターを呼び出して、要求されたクライアントを指定します。たとえば、PlusClientとGamesClientを要求するには、BaseGameActivity(CLIENT_GAMES | CLIENT_PLUS)を使用します。 *利用可能なすべてのクライアントを要求するには、BaseGameActivity(CLIENT_ALL)を使用します。 *または、リクエストされたクライアントを@link {#setRequestedClients}で指定することもできますが、@ link {#onCreate}が呼び出される前に指定する必要があります。そうしないと、呼び出しは無効になります。 * * @author Bruno Oliveira(Google)

0
user2346305