在 Android 中使用 Google Play 游戏服务进行登录出现12501报错
添加Google Play服务
在项目的顶级build.gradle文件中,确保包含Google的Maven存储库:
allprojects {
repositories {
google()
// If you're using a version of Gradle lower than 4.1, you must instead use:
// maven {
// url 'https://maven.google.com'
// }
}
}
然后,在您的应用程序级别的build.gradle文件中,将Google Play服务声明为依赖项:
apply plugin: ‘com.android.application’
…
dependencies {
implementation 'com.google.android.gms:play-services-auth:19.0.0'
}
配置Google API控制台项目
要配置Google API控制台项目,请点击下面的按钮,并在出现提示时指定应用的程序包名称。您还需要提供签名证书的SHA-1哈希。有关信息,请参见验证客户端。
获取后端服务器的OAuth 2.0客户端ID
如果您的应用通过后端服务器进行身份验证或从后端服务器访问Google API ,则必须获取为服务器创建的OAuth 2.0客户端ID。要查找OAuth 2.0客户端ID,请执行以下操作:
在API控制台中打开“凭据”页面。
Web应用程序类型的客户端ID是您的后端服务器的OAuth 2.0客户端ID。
注意:如果您最近尚未创建新的Android客户端,则可能没有Web应用程序类型的客户端ID。您可以通过打开“凭据”页面并单击“新建凭据”>“ OAuth客户端ID”来创建一个。
创建GoogleSignInOptions对象时,将此客户端ID传递给requestIdToken或requestServerAuthCode方法。
配置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"/>
一定要原封不动使用这两句。要不然的话就会登陆异常。我就试过把app_id直接替换上面的。登陆一直报 12501 错误。只有严格按文档说做的才不会有问题。
配置Google登录和GoogleSignInClient对象
在登录活动的onCreate方法中,配置Google登录以请求您的应用所需的用户数据。例如,要配置Google登录以请求用户ID和基本个人资料信息,请使用DEFAULT_SIGN_IN参数创建一个GoogleSignInOptions对象。要同时请求用户的电子邮件地址,请使用requestEmail选项创建GoogleSignInOptions对象。
代码
// Configure sign-in to request the user’s ID, email address, and basic
// profile. ID and basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
然后,同样在登录活动的onCreate方法中,使用您指定的选项创建一个GoogleSignInClient对象。
代码
// Build a GoogleSignInClient with the options specified by gso.
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
登录函数
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
用户GoogleSignInAccount后,您可以在活动的onActivityResult方法中获取该用户的GoogleSignInAccount对象。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
最后特别注意。
1.首先检查包名和指纹 SHA1 是否有效。
2.如果您的应用没有通过验证并且没有发布,那么请确保要授权的用户在测试人员列表中(这可以在 APIs & Service -> OAuth 同意屏幕 -> 测试用户中查看)
怀疑android studio中包名中的所有字母都应该小写。
在我的例子中,它有助于创建一个新项目,将旧文件传输到它,并创建一个新的 OAuth 客户端 ID。
https://developers.google.com/identity/sign-in/android/sign-in
https://firebase.google.com/docs/auth/android/play-games