应用程序没有在 MainActivity 上登录,而是在下一个活动中登录。使用 BaseGameUtils 实现 Google Play 服务登录

Posted

技术标签:

【中文标题】应用程序没有在 MainActivity 上登录,而是在下一个活动中登录。使用 BaseGameUtils 实现 Google Play 服务登录【英文标题】:App does not sign in on MainActivity but signs in, in the next activity. Implementing Google Play Services Signin using BaseGameUtils 【发布时间】:2015-07-01 21:49:41 【问题描述】:

我正在尝试使用 BaseGameUtils 为我的游戏实现 Google 登录。

项目结构如下:

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

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

理想情况下,我希望游戏在 MainActivity 中自动登录,或者通过点击登录按钮。

但对于 API 级别 MainActivity 登录失败并引发“未知错误”。

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

附加信息:

在调查期间,我发现在我的设备上使用 API

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

API 21 不会出现此错误。另外,我发现 API 19 中添加了 AppOpsManager

所以,我怀疑这是问题的根本原因,但是我无法弄清楚如何解决这个问题。

我一直在寻找解决方案,但未成功尝试以下主题中发布的答案:

Google game services sign in issue (fails first attempt, successful second)

Google Play Game Services: strange sign in behavior

LoginActivity.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() 


【问题讨论】:

尝试添加.addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN) GoogleApiClient builder。 嗨,谢谢。我最初也添加了这一点。但这对当前的行为没有影响。 你打电话给onActivityResultMainActivity???如果没有,请尝试在派生类中添加onActivityResult 我这样做了,但它不起作用,而且 NormalActivity 类没有 onActivityResult 函数,但它调用 super.onStart() ,我调用 mGoogleApiClient.connect(),连接成功。 现在可以用了吗? Bcz 除了我能想到的这两种可能性之外,我没有发现您的代码有任何问题。 【参考方案1】:

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

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

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

删除launchMode 参数解决了问题。

希望这有助于其他陷入类似问题的人。

【讨论】:

读完这篇文章后,我通过了这个旧的answer。这就解释了为什么登录对您的 MainActivity 不起作用。 知道了!非常感谢您的帮助! 这是一个有趣的问题.. :)

以上是关于应用程序没有在 MainActivity 上登录,而是在下一个活动中登录。使用 BaseGameUtils 实现 Google Play 服务登录的主要内容,如果未能解决你的问题,请参考以下文章

MainActivity 运行时未启动 [重复]

登录时从另一个活动启动应用程序

在Firebase身份验证后启动MainActivity

无法向 Mainactivity 添加操作,因为它不支持操作

具有不同活动的社交登录

反应本机 - MainActivity.java