最近公司项目刚好集成了google 和 facebook 登录,中间遇到了一些问题,所以记录下来.
主要问题如下:
1)如何集成google 和 facebook 登录,主要参考官方文档。
2)应用上线后,google和facebook 登录失败
集成google 登录 ,整个流程如下:
第一步:
firebase官网:https://console.firebase.google.com/?hl=zh-cn&pli=1
在firebase 中添加应用,并且添加sha1, 下载相应的google-service.json文件
第二步:
登录google 开发者后台:https://console.developers.google.com/apis/,添加 api key, 并配置包名,sha1值。
第三步:
代码
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestId()
.requestProfile()
.requestEmail()
.requestIdToken(GOOGLE_CLIENT_ID)
.build();
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(AppCore.getmCurrentActivity())
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
Intent intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(intent, GOOGLE_SIGN_IN); //RC_SIGN_IN是requestcode
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOOGLE_SIGN_IN) { //google登录
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
} else {
javaBridgeToCpp.signInFormGoogleCallback("error", "", "", "", "", 1000, mForceLogin);
Toast.makeText(AppActivity.this, "Google SignIn Failed", Toast.LENGTH_SHORT).show();
}
}
注意: 这里的GOOGLE_CLIENT_ID 是 web_client_id. 如下
Facebook 登录:
第一步:
在facebook 开发者中心,网址:https://developers.facebook.com/docs/facebook-login/android
配置包名,启动Activity, 密钥散列值。
第二步:
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
getLoginInfo(loginResult.getAccessToken());
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
Toast.makeText(AppActivity.this, "Facebook Login Fail", Toast.LENGTH_SHORT).show();
}
});
LoginManager.getInstance().
logInWithReadPermissions(AppCore.getmCurrentActivity(), Arrays.asList("public_profile"));
public void getLoginInfo(final AccessToken accessToken) {
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (object != null) {
String name = object.optString("name"); //比如:Zhang San
String gender = object.optString("gender"); //性别:比如 male (男) female (女)
String email = object.optString("email"); //邮箱:比如:56236545@qq.com
JSONObject object_pic = object.optJSONObject("picture");
JSONObject object_data = object_pic.optJSONObject("data");
String photo = object_data.optString("url");
javaBridgeToCpp.signInFormFacebookCallback("success", name, photo, email, accessToken.getToken(), 1000, mForceLogin);
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
request.setParameters(parameters);
request.executeAsync();
}
注意点:google play上线后会自动给apk 重新签名, 因此上线后,会导致google和facebook 登录失败,解决方法是将google play
的签名文件的sha1值保存到firebase 后台并重新下载google-service.json 文件,以及将google play 的签名文件的密钥散列值保存到facebook 开发者后台。
参考文章:
https://blog.csdn.net/robin_java/article/details/52540711
https://blog.csdn.net/Yzw_92_4_11/article/details/78281956