Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google play服务游戏显着()失败错误';com.google.android.gms.common.api.ApiException:4:4';_Java_Android_Kotlin_Google Signin_Google Play Games - Fatal编程技术网

Java Google play服务游戏显着()失败错误';com.google.android.gms.common.api.ApiException:4:4';

Java Google play服务游戏显着()失败错误';com.google.android.gms.common.api.ApiException:4:4';,java,android,kotlin,google-signin,google-play-games,Java,Android,Kotlin,Google Signin,Google Play Games,我正在使用google play services signizely(),但我收到的错误是signizely()失败com.google.android.gms.common.api.ApiException:4:4:,但我是应用程序中的测试用户。我已经在我的firebase项目中添加了SHA-1、客户ID、客户机密和启用谷歌登录、谷歌游戏服务。我的代码在下面 class SignInGGPlayBan2 : AppCompatActivity() { private lateinit v

我正在使用google play services signizely(),但我收到的错误是signizely()失败com.google.android.gms.common.api.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
        }

    }
}
错误

清单文件

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

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

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

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

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

</manifest>  


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

首先,你应该把它放在你的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"/>

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

这里有三个控制台很有用: Firebase控制台/项目设置:

Google开发者控制台/凭据:

链接应用程序:

看起来您使用的是firebase,这里也一样。当然,我们将遵循指南:。在我的例子中,我们正在使用Play Games登录

要修复开发人员错误(10)/内部错误(8)/API未连接(17)/需要登录(4)等GMS API异常,请遵循以下检查表:

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

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

    相关答案:


    你并不孤单,我为此痛苦了几天。有什么要分享的吗?
    <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"/>