一 登录接入准备
- 登录官方文档
- 在上面的网址中,点击
CONFIGURE A PROJECT
来创建一个登录的工程 - 按要求生成 SHA-1
keytool -exportcert -keystore your_keystore -list -v
- 注意 ==如果编译的版本使用的keystore和这里用的keystore不同,则登录时会log中会报错 Status{statusCode=DEVELOPER_ERROR, resolution=null}== 可以参见 stackoverflow上的问题
- 点击官方文档页面中按钮
GOOGLE API CONSOLE
,进入api后台,查看凭据
。这个是OAuth 2.0客户端 ID
栏目下面应该会有一条Web client (Auto-created for Google Sign-in)
,这就是第二步中生成的访问秘钥了。
二 支付接入准备
- 测试订单:设置 -> 账号详情页 -> 许可测试 添加需要许可的google账号
- 在Google Play Console中新建应用
- 应用的商店发布->应用内商品 添加需要出售的商品
- 发布测试版本:版本管理->应用版本->发布alpha或其他测试版本。 点入测试版本后即可管理测试人员,建议都设置为封闭式测试,版本发布==一段时间==后,
加入测试的网址
就会显示一个加入测试链接,参加测试的人员就可以进入页面加入测试。
三 游戏成就接入准备
- 官方文档
- 同在Google Play Console中 最上层菜单中找到
游戏服务
中,新建一个游戏服务项目,并关联前面建立的应用。 - 设置好成就内容,并将成就Id放入自己游戏app的配置中,激活时需要使用
- 游戏关联游戏服务后,需要设置好游戏服务内容,并发布,才能再修改
二
中的应用的商品详情了。但是需要谨慎对待游戏服务的发布,发布后==成就==则不可删除了。 - 在 游戏服务-> 关联的应用 中设置绑定的 api客户端; 这里也可以看到应用Id,一个12位的数字,也就是游戏服务任意页面上 项目名称下面的那串数字,后面访问的时候需要用到。
四 正式接入
-
在build.gradle的dependencies中加入需要的库
compile 'com.google.android.gms:play-services-auth:11.8.0' compile 'com.google.android.gms:play-services-games:11.8.0'
-
在res/strings.xml中加入
三
中的应用Id。实际后面没有再用到一
中创建的那个Web client (Auto-created for Google Sign-in)
,只接入login时是需要的,接入游戏服务之后,已经被后面的代替。<string name="google_app_id">your_game_app_id</string>
-
在AndroidManifest.xml中加入属性设定
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/google_app_id" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
-
登录实现。如果只接登录,则将
DEFAULT_GAMES_SIGN_IN
修改为DEFAULT_SIGN_IN
。以下代码段需要放到各自合适的地方// 1. 创建client GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestIdToken(this.getString(R.string.server_client_id)) .requestEmail() .build(); m_GoogleSignInClient = GoogleSignIn.getClient(this, gso); // 2. 发起登录 this.runOnUiThread(new Runnable() { @Override public void run() { Intent signInIntent = m_GoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, GOOGLE_LOGIN_REQUEST_ID); // GOOGLE_LOGIN_REQUEST_ID 自己定义 } }); // 3. 在onActivityResult中响应登录 Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); Games.getGamesClient(this, account).setViewForPopups(getWindow().getDecorView()); // 这里可以获取 account.getIdToken() 用于服务端验证 // account.getDisplayName() 名称显示 } catch (ApiException e) { Log.d(m_LogTag, "google signInResult:failed code=" + e.getStatusCode()); }
==注意:Games.getGamesClient(this, account).setViewForPopups(getWindow().getDecorView());== 这句话用来设置登录结果及google成就完成时浮窗的父窗口。若未设置,也可以正常登录及完成成就,但无google自己的浮窗提示。
-
成就激活。成就的激活比较简单,只需要一句代码。
// 这里的成就id就是google后天中成就的id Games.getAchievementsClient(this, account).unlock("your_achievement_id"); // 也可以显示所有成就 Games.getAchievementsClient(this, GoogleSignIn.getLastSignedInAccount(this)) .getAchievementsIntent() .addOnSuccessListener(new OnSuccessListener<Intent>() { @Override public void onSuccess(Intent intent) { startActivityForResult(intent, RC_ACHIEVEMENT_UI); } });
-
支付接入。如果有自己的订单系统,那么需要注意两点。
- 将自己的订单Id 作为payload传递给google订单。
- 在自己的订单验证通过完成后,再去消耗google商品。
- 增加权限
<uses-permission android:name="com.android.vending.BILLING" />
- 将google支付示例中的 aidl 加入到自己的工程中 示例下载
- 加入google支付示例中的util工具
util/google_play_util/
- 手机上安装GooglePlay环境
- 代码接入
// 1. 定义变量 IabHelper mHelper; // 这个key在 google play consle中 选择应用->开发工具->服务和API 中,找到"许可与应用内购买结算",那里的 RSA公钥 static final String base64EncodedPublicKey = "your_public_key"; // 2. 初始化 IabHelper mHelper = new IabHelper(this, base64EncodedPublicKey); mHelper.enableDebugLogging(true, "PayHelper"); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { mServicSuccess = result.isSuccess(); } }); // 3. 还是自己抄示例代码吧 很简单的 ...
- 如需服务端验证:api 后台需要开放服务账号,以及在google play consle中将服务账号加入,并授予财务信息方法权限。
五 常见问题
- 注意
如果编译的版本使用的keystore和这里用的keystore不同,则登录时会log中会报错 Status{statusCode=DEVELOPER_ERROR, resolution=null}
可以参见 stackoverflow上的问题 - 如果成就能激活,但不显示google的成就浮窗,需要在登录完成时设置:
Games.getGamesClient(this, account).setViewForPopups(getWindow().getDecorView());