应用程序未在MainActivity上登录,但在下一个活动中登录.使用BaseGameUtils实现Google Pla



我正试图在我的游戏中使用BaseGameUtils实现谷歌登录。

项目结构如下:

public class LoginActivity extends BaseGameActivity implements... {}
public class MainActivity extends LoginActivity   {}
public class NormalActivity extends LoginActivity      {}

在应用程序过程中,MainActivity启动NormalActivity

理想情况下,我希望游戏自动登录MainActivity,或单击登录按钮。

但对于API水平<21,我观察到从MainActivity登录失败并抛出"未知错误"。

但是,在此失败后,当我从MainActivity打开NormalActivity,会出现登录弹出窗口,并且在NormalActivity内登录成功。

附加信息:

在我的调查期间,我观察到在我的设备上API<21我在控制台中得到以下错误:

E/dalvikvm: Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.GooglePlayServiceUtil.zza

API 21没有出现此错误。此外,我发现AppOpsManager已添加到API 19中。

所以,我怀疑这是问题的根本原因,但我不知道如何解决这个问题。

我一直在寻找解决方案,但没有成功地尝试了以下帖子中发布的答案:

谷歌游戏服务登录问题(第一次尝试失败,第二次成功)

Google Play游戏服务:奇怪的登录行为

登录活动.java

public class LoginActivity extends BaseGameActivity implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
ResultCallback<People.LoadPeopleResult>{
private static final int RC_SIGN_IN = 9001;
public GoogleApiClient mGoogleApiClient;
private boolean mResolvingConnectionFailure = false;
private boolean mAutoStartSignInFlow = true;
private boolean mSignInClicked = false;
String TAG = "LoginActivity: ";
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate()");
mGoogleApiClient = buildGoogleApiClient();
}
@Override
protected void onStart()
{
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop()
{
super.onStop();
Log.d(TAG, "onStop(): disconnecting");
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
public GoogleApiClient buildGoogleApiClient() {
GoogleApiClient.Builder builder = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Games.API).addScope(Games.SCOPE_GAMES);
return builder.build();
}
@Override
public void onConnected(Bundle connectionHint) {
Log.i(TAG, "onConnected");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (mResolvingConnectionFailure) {
return;
}
if (mSignInClicked || mAutoStartSignInFlow) {
mAutoStartSignInFlow = false;
mSignInClicked = false;
mResolvingConnectionFailure = true;
if (!BaseGameUtils.resolveConnectionFailure(this,
mGoogleApiClient, connectionResult,
RC_SIGN_IN, getResources().getString(R.string.signin_other_error)))
{
mResolvingConnectionFailure = false;
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
mSignInClicked = false;
mResolvingConnectionFailure = false;
if (resultCode == RESULT_OK) {
mGoogleApiClient.connect();
} else {
BaseGameUtils.showActivityResultError(this,
requestCode, resultCode, R.string.signin_failure);
}
}
}

@Override
public void onConnectionSuspended(int cause) {
mGoogleApiClient.connect();
}
@Override
public void onResult(People.LoadPeopleResult loadPeopleResult) {
}
public boolean isSignedIn() {
return (mGoogleApiClient != null && mGoogleApiClient.isConnected());
}

@Override
public void onSignInFailed() {
}
@Override
public void onSignInSucceeded() {
}}

我找到了这种行为的原因。

由于MainActivityNormalActivity都是LoginActivity的派生,我认为这些类的基本实现没有问题。

MainActivityNormalActivity之间的唯一差异是在AndroidManifest.xml中,MainActivityandroid:launchMode: "singleInstance"

删除launchMode参数解决了问题。

希望这能帮助其他陷入类似问题的人。

最新更新