【问题标题】:SIGN_IN_REQUIRED - Google GamesSIGN_IN_REQUIRED - Google 游戏
【发布时间】:2016-11-15 16:33:38
【问题描述】:

我有一个简单的游戏,有一个排行榜按钮,它显示玩家的最高分,在发布这个问题之前,我已经确定了以下几点:

  1. SHA1 指纹。
  2. API 已启用。
  3. 正确的包。
  4. 正确的应用 ID。
  5. 已导入并添加了 Google Play 服务库。
  6. 配置文件已导入。
  7. Admob、Analytics 和崩溃报告运行良好。
  8. GET ACCOUNTS 已经添加,还是一样。

我的问题是,没有显示帐户选择器/选择器,甚至没有登录,我收到以下错误:

ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{fbd982b: android.os.BinderProxy@b3d396d}, message=null

代码:

public class MainActivity extends AppCompatActivity implements
    GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

ImageButton mLeaderBoard;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_welcome);
    mLeaderBoard = (ImageButton) findViewById(R.id.leaderboard);
    mLeaderBoard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ShowBoard();
        }
    });

   mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Games.API)
            .addScope(Games.SCOPE_GAMES)
            .addScope(SCOPE_PLUS_PROFILE)
            .build();
}

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();

}

@Override
protected void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

private void ShowBoard() {
    if(!isSignedIn()){
        mGoogleApiClient.connect();
    }
    mGoogleApiClient.connect();
    if(isSignedIn())
    startActivityForResult(Games.Leaderboards.getLeaderboardIntent(mGoogleApiClient,
            LEADERBOARD_TOP_SCORE_ID), 1);
    else
        Toast.makeText(this, getResources().getString(R.string.leaderboard_not_available), Toast.LENGTH_LONG).show();

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == 1) {

        Log.i("GoogleSignInApi","Result: " + resultCode + " - Data: " + data.getData());
        if (resultCode == RESULT_OK) {

        }
    }
}



@Override
public void onConnected(Bundle bundle) {

}

@Override
public void onConnectionSuspended(int i) {
    mGoogleApiClient.connect();
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.i("GoogleSignInApi","Problem: " + connectionResult.getErrorMessage() + " - Test: " + connectionResult.toString());
}

 }

【问题讨论】:

标签: android google-play-services google-play-games


【解决方案1】:

AFAIK,您应该拥有SCOPE_PLUS_PROFILE - OAuth2.0 范围来访问用户的个人资料数据。您需要启用 Google+ API 并使用 SHA1 和您的包创建凭据。带有您的电子邮件和产品名称的 Oauth 同意屏幕。

确保您拥有所需的权限和所有软件包,示例如下:

applicationId in tag <application> 
package name in AndroidManifest.xml 
package name in Credentials in Google Developer Console

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

另外,您需要致电onActivityResult。当客户端无法连接到 Google Play 服务时,需要它来处理所有可能的错误代码。

【讨论】:

  • Google+ Api 已经启用,在我的 Google Dev Console 中,只有一条记录(OAuth2),详细信息(SHA1 指纹 + 包)是正确的,添加了权限,并添加了 Plus 配置文件,仍然同样的问题,检查更新的代码。
【解决方案2】:

在我的情况下,即使用户以前从未使用 google 登录过我的应用程序,我也试图从 google 注销

const signInGoogle = async () => {
    try {
      await GoogleSignin.hasPlayServices();
      const userInfo = await GoogleSignin.signIn();
      console.log(userInfo);
      const payload = {
        token: userInfo.idToken,
        first_name: userInfo.user.givenName,
        last_name: userInfo.user.familyName,
        email: userInfo.user.email,
      };
      props.actions.socialLogin(payload);
      console.warn('google', payload);
    } catch (error) {
      if (error.code === statusCodes.SIGN_IN_CANCELLED) {
        // user cancelled the login flow
        alert('Cancel');
      } else if (error.code === statusCodes.IN_PROGRESS) {
        alert('Signin in progress');
        // operation (f.e. sign in) is in progress already
      } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
        alert('PLAY_SERVICES_NOT_AVAILABLE');
        // play services not available or outdated
      } else {
        console.log(error);
      }
    }
  }
  const handleGoogle = async () => {

    try{
      await GoogleSignin.revokeAccess();
      await GoogleSignin.signOut();
      signInGoogle()
    }catch(e){
      //HERE IT Throws the SIGN_IN_REQUIRED ERROR DUE TO signOut function
      signInGoogle()
    }
  };

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多