Google提供BaseGameUtils
库和recommend us to extends its BaseGameActivity
。但是,该课程使游戏在游戏开始时自动登录。如果玩家不想或无法连接到他的Google帐户,那么在游戏开始时这可能非常耗时。
所以我不想要这个功能。相反,我想提供一个登录按钮。只有当他点击该按钮时才能连接播放器。 从那时起,每次玩家开始游戏时,他都会自动连接到他的Google帐户,而无需点击任何按钮。我怎么能这样做?
答案 0 :(得分:44)
好的,我已经弄明白了,默认情况下,最大自动登录时间是3 ,这意味着如果用户取消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);
答案 1 :(得分:10)
在GameHelper.java
文件中有一个名为mConnectOnStart
的布尔属性,默认情况下它设置为true。只需将其更改为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;
}
您可以使用上述方法自定义登录过程。
就我而言,与你类似,我不想第一次自动连接。但如果用户之前登录过,我确实想要自动连接。为了实现这一点,我将位于getGameHelper()
类中的BaseGameActivity
方法更改为:
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()
方法都会从onStart()
中的BaseGameActivity
调用setConnectOnStart()
方法。在上面的代码中,我刚刚添加了共享首选项,以便在用户之前登录时保留。并根据该案例调用"WAS_SIGNED_IN"
方法。
最后,在用户启动登录过程后,不要忘记将onSignInSucceeded()
(或者如果您使用不同名称定义的其他内容)共享首选项设置为true。您可以在BaseGameActivity
类的{{1}}方法中执行此操作。
希望这会对你有所帮助。祝你好运。
答案 2 :(得分:3)
我是这样做的,我不知道这是否是最佳方式。我更改了GameHelper类,因此它将用户首选项存储在共享首选项中:
...
public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
....
// Whether to automatically try to sign in on onStart(). We only set this
// to true when the sign-in process fails or the user explicitly signs out.
// We set it back to false when the user initiates the sign in process.
boolean mConnectOnStart = false;
...
/** Call this method from your Activity's onStart(). */
public void onStart(Activity act) {
mActivity = act;
mAppContext = act.getApplicationContext();
debugLog("onStart");
assertConfigured("onStart");
SharedPreferences sp = mAppContext.getSharedPreferences(GAMEHELPER_SHARED_PREFS, Context.MODE_PRIVATE);
mConnectOnStart = sp.getBoolean(KEY_AUTO_SIGN_IN, false);
if (mConnectOnStart) {
...
}
...
/** Sign out and disconnect from the APIs. */
public void signOut() {
...
// Ready to disconnect
debugLog("Disconnecting client.");
mConnectOnStart = false;
SharedPreferences.Editor editor = mAppContext.getSharedPreferences(GAMEHELPER_SHARED_PREFS, Context.MODE_PRIVATE).edit();
editor.putBoolean(KEY_AUTO_SIGN_IN, false);
editor.commit();
mConnecting = false;
mGoogleApiClient.disconnect();
}
...
/**
* Starts a user-initiated sign-in flow. This should be called when the user
* clicks on a "Sign In" button. As a result, authentication/consent dialogs
* may show up. At the end of the process, the GameHelperListener's
* onSignInSucceeded() or onSignInFailed() methods will be called.
*/
public void beginUserInitiatedSignIn() {
debugLog("beginUserInitiatedSignIn: resetting attempt count.");
resetSignInCancellations();
mSignInCancelled = false;
mConnectOnStart = true;
SharedPreferences.Editor editor = mAppContext.getSharedPreferences(GAMEHELPER_SHARED_PREFS, Context.MODE_PRIVATE).edit();
editor.putBoolean(KEY_AUTO_SIGN_IN, true);
editor.commit();
if (mGoogleApiClient.isConnected()) {
...
}
...
private final String GAMEHELPER_SHARED_PREFS = "GAMEHELPER_SHARED_PREFS";
private final String KEY_SIGN_IN_CANCELLATIONS = "KEY_SIGN_IN_CANCELLATIONS";
private final String KEY_AUTO_SIGN_IN = "KEY_AUTO_SIGN_IN";
...
}
请参阅https://github.com/playgameservices/android-samples/blob/master/FAQ.txt第54行自动登录的原因
答案 3 :(得分:1)
从onCreate
调用getGameHelper().setConnectOnStart(false);
答案 4 :(得分:0)
实际上,Google的代码与您在第二段中所讨论的完全一样。
我想提供一个登录按钮。只有当他点击该按钮时才能连接播放器。从那时起,每次玩家开始游戏时,他都会自动连接到他的Google帐户,而无需点击任何按钮。我怎么能这样做?
Helper.setup方法创建客户端
onStart查看自动登录的内部布尔值。如果用户之前已连接(并且用户未注销,或断开连接时没有错误),则会尝试重新登录。
如果启动成功连接,beginUserInitiatedSignIn将设置自动登录布尔值
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(谷歌)