有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Google play服务游戏显着()失败错误'com。谷歌。安卓gms。常见的应用程序编程接口。ApiException:4:4'

我正在使用google play services signizely(),但我收到了错误signizely(),com失败。谷歌。安卓gms。常见的应用程序编程接口。ApiException:4:4:,但我是应用程序中的测试用户。我已经在我的firebase项目中添加了SHA-1、客户ID、客户机密和启用谷歌登录、谷歌游戏服务。我的代码在下面

class SignInGGPlayBan2 : AppCompatActivity() {
  private lateinit var googleSignInClient: GoogleSignInClient
  private lateinit var auth: FirebaseAuth
    companion object {
        private val TAG = "SignInGGPlayBan2"
        private const val RC_SIGN_IN = 9001
    }

private var btnSignIn: SignInButton? = null
private var btnGGPlayGameSignOut: Button? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ggplay)

    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
        .requestServerAuthCode(getString(R.string.default_web_client_id))
        .build()

    googleSignInClient = GoogleSignIn.getClient(this, gso)

 auth = FirebaseAuth.getInstance()

    btnSignIn = findViewById(R.id.btnGGPlayGame)
    btnGGPlayGameSignOut = findViewById(R.id.btnGGPlayGameSignOut)

    btnSignIn!!.setOnClickListener {
        startSignInIntent()
    }

}

override fun onStart() {
    super.onStart()
    val currentUser = auth.currentUser
    updateUI(currentUser)
}

private fun startSignInIntent() {
    val intent = googleSignInClient.signInIntent
    startActivityForResult(intent, RC_SIGN_IN)
}

private fun signInSilently() {
    googleSignInClient.silentSignIn().addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            Toast.makeText(this@SignInGGPlayBan2, "Successful", Toast.LENGTH_SHORT).show()
            firebaseAuthWithPlayGames(task.result!!)
        } else {
            Log.d(TAG, "signInSilently() Failed", task.getException())
            Toast.makeText(this@SignInGGPlayBan2, "Failed", Toast.LENGTH_SHORT).show()

        }

    }

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN) {
        val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
        if (result!!.isSuccess) {
            firebaseAuthWithPlayGames(result.signInAccount!!)
            Toast.makeText(this@SignInGGPlayBan2, "Successful Activity", Toast.LENGTH_SHORT).show()

        } else {
            Toast.makeText(this@SignInGGPlayBan2, "Failed Activity", Toast.LENGTH_SHORT).show()

        }
    }

private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)
    val auth = FirebaseAuth.getInstance()
    val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "signInWithCredential:success")
                val user = auth.currentUser
                updateUI(user)

            } else {
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                Toast.makeText(baseContext, "Authentication failed.", Toast.LENGTH_SHORT).show()
                updateUI(null)
            }

        }
}

override fun onResume() {
    super.onResume()
    signInSilently()
}

 private fun updateUI(currentUser: FirebaseUser?) {
        if (currentUser != null) {
            btnGGPlayGameSignOut!!.visibility = View.VISIBLE

        } else {
            btnGGPlayGameSignOut!!.visibility = View.INVISIBLE
        }

    }
}

错误

signInSilently() Failed
    com.google.安卓.gms.common.api.ApiException: 4: 4: 
  at com.google.安卓.gms.common.internal.ApiExceptionUtil.fromStatus(com.google.安卓.gms:play-services-base@@17.1.0:4)
  at com.google.安卓.gms.common.internal.zai.zaf(com.google.安卓.gms:play-services-base@@17.1.0:2)
  at com.google.安卓.gms.common.internal.zak.onComplete(com.google.安卓.gms:play-services-base@@17.1.0:6)
  at com.google.安卓.gms.common.api.internal.BasePendingResult.zaa(com.google.安卓.gms:play-services-base@@17.1.0:176)
 at com.google.安卓.gms.common.api.internal.BasePendingResult.setResult(com.google.安卓.gms:play-services-base@@17.1.0:135)
 at com.google.安卓.gms.auth.api.signin.internal.zzi.zzc(com.google.安卓.gms:play-services-auth@@18.0.0:5)
 at com.google.安卓.gms.auth.api.signin.internal.zzs.dispatchTransaction(com.google.安卓.gms:play-services-auth@@18.0.0:6)
 at com.google.安卓.gms.internal.auth-api.zzc.onTransact(com.google.安卓.gms:play-services-auth@@18.0.0:13)
 at 安卓.os.Binder.execTransact(Binder.java:565)

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    package="com.example.myprojecttest">

<uses-permission 安卓:name="安卓.permission.INTERNET"/>

<application
    安卓:allowBackup="true"
    安卓:icon="@mipmap/ic_launcher"
    安卓:label="@string/app_name"
    安卓:roundIcon="@mipmap/ic_launcher_round"
    安卓:supportsRtl="true"
    安卓:theme="@style/AppTheme">

    <activity 安卓:name=".SignInGGPlayBan2">
        <intent-filter>
            <action 安卓:name="安卓.intent.action.MAIN" />

            <category 安卓:name="安卓.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>  

请给我一个解决这个问题的办法


共 (2) 个答案

  1. # 1 楼答案

    我这几天一直在忍受这种痛苦。今天我终于明白了

    这里有三个控制台很有用: Firebase控制台/项目设置: https://console.firebase.google.com

    谷歌开发者控制台/证书: https://console.developers.google.com/apis/credentials

    链接应用程序: https://play.google.com/apps/publish/

    看起来你用的是firebase和这里的一样。当然,我们将遵循指南:https://firebase.google.com/docs/auth/android/play-games?authuser=0。在我的例子中,我们正在使用Play Games登录

    要修复开发者错误(10)/内部错误(8)/API未连接(17)/SIGN IN REQUIRED(4)等GMS API异常,请遵循以下检查表:

    1. 忽略Gradle任务signingReport,这很重要,否则它会自动创建一个OAuth 2.0客户端ID,其中your.package.name~/.android/debug.keystore中的SHA1,这很容易出错
    2. 创建或使用您自己的密钥存储文件,您可以从Android Studio/Build/Generate Signed Bundle或APK/Create new…/选择现有的。。。,(这里我创建了两个文件,一个用于调试,一个用于发布,以下称为debug.jks和release.jks)
    3. 从调试中获取SHA1。jks使用keytool -exportcert -alias YOUR_ALIAS -keystore debug.jks -list -v,将调试SHA1粘贴到Firebase控制台
      Firebase Console保存配置,并将google-service.json正确下载到Android Studio。注意,您只设置了调试SHA1,而没有设置发布SHA1。然后运行你的应用程序,这个过程将使用debug SHA1自动创建一个OAuth 2.0客户端ID。你可以刷新Google开发者控制台/凭证来检查你做了什么
    4. 不要从谷歌开发者控制台/凭据创建OAuth 2.0客户端ID,所有ID都应该从谷歌服务或链接的应用程序自动创建
    5. 然后你应该在谷歌开发者控制台/凭证上有两个客户端ID:Android client for your.package.name (auto created by Google Service)Web client (auto created by Google Service)检查google-service.json文件,它将包含两个client_id,两者必须与谷歌开发者控制台/凭证完全相同
    6. 确保您已在Firebase控制台(身份验证部分)中进行了设置
    7. 现在我们来做链接应用。就像指南一样:https://firebase.google.com/docs/auth/android/play-games?authuser=0#link_your_firebase_project_to_your_play_publisher_account,但要注意这里有一个巨大的差异,在点击授权你的应用程序后,控制台会尝试自动添加你的Google Play应用程序签名SHA1作为客户端ID(不是release.jks SHA1,release.jks SHA1是一个上传密钥,Google Play将用自己的密钥退出APK/捆绑包)。请随意创建它,顺便说一句,将链接的应用重命名为“Your app Name-Google Play”是一个不错的爱好。然后刷新Google开发者控制台/凭据以进行检查
    8. 让我们将另外两个名为“Your App Name-AdHoc”的应用程序与发布的SHA1链接起来。jks和调试中的“你的应用程序名-调试”。jks
    9. 现在生成签名包或APK。确保你的APK文件签名正确。请注意,使用Android studio,调试模式下的Run 'YOUR_PROJECT'将使用~/.android/debug.keystore对APK进行签名,SHA1不是用于创建客户端id的
    10. 安装APK

    谷歌开发者控制台/凭证应该如下图所示:
    Credentials 链接的应用程序应该如下图所示:
    linked apps

    谢谢谷歌和我的头发,祝你好运

    相关答案:

    How to sign your app using the upload key

    Test Google Play Games on app signed with upload key

    Testing Games Services using upload key instead of Google Play App signing key

  2. # 2 楼答案

    首先,你应该把这个写在你的AndroidManifest上。xml

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />
    <meta-data android:name="com.google.android.gms.version"
       android:value="@integer/google_play_services_version"/>