1:google登录
google登录和Facebook登录都是提供的自定义view按钮:
<com.google.android.gms.common.SignInButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/google_sign"
></com.google.android.gms.common.SignInButton>
google客户端校验初始化如下:
private GoogleSignInClient mGoogleSignInClient;
public void initGoogleClient(){
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
}
google按钮点击事件:
googleLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, 1001);
}
});
注:这里按钮可以是google中的signInButton,也可以是我们自己设置的button。
接着在onActivityResult接收。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==1001){
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
Account account1=account.getAccount();
L.e(TAG,"name:"+account1.name+"--type:"+account1.type+"--"+account.getId()+"--"+account.getIdToken());
} catch (ApiException e) {
e.printStackTrace();
L.e(TAG,"account失败+"+e.getStatusCode()+"--"+e.getStatusMessage());
}
}
}
另一种是服务端校验,android端获取ServerAuthCode发送给后端,
这里不同的是:GoogleSignInOptions 的初始化:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(Scopes.DRIVE_APPFOLDER))
.requestServerAuthCode(getResources().getString(R.string.server_client_id))
.requestEmail()
.build();
这里server_client_id是google后台创建的
证书地址
如图,这是我创建好的截图,如果没有点击
选择OAuth client ID:
这里使用requestServerAuthCode是使用的web application
2:Facebook登录
2.1 开发者后台
Facebook 开发者后台
创建应用拿到应用编号;
2.2导入sdk
implementation 'com.facebook.android:facebook-login:[5,6)'
2.3编辑清单和文件
首先在values下的strings.xml添加facebook_app_id和fb_login_protocol_scheme:
<string name="facebook_app_id">xxx</string> <string name="fb_login_protocol_scheme">fb+facebook_app_id</string>
然后在清单中添加对应的activity等数据:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"
/>
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges= "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
2.4关联应用
这一步骤,主要提供包名,跳转的mainactivity,以及秘钥散列。
秘钥散列可根据提供的秘钥散列库中的工具获取:
获取命令如下:
keytool -exportcert -alias androiddebugkey -keystore "C:\Users\USERNAME\.android\debug.keystore" | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" sha1 -binary | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" base64
2.5设置按钮
首先,设置布局按钮,使用第三方给定的按钮
<com.facebook.login.widget.LoginButton
android:id="@+id/login_button_facebook"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp"
/>
如图:
当然也可以使用自己设置的按钮
<Button
android:id="@+id/facebook_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp"
android:text="facebook 登录"
/>
十分简单就是写了个按钮,具体的关联在代码中。
2.6实现
使用LoginButton时添加下面的代码:
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
然后添加回调:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
如果是自定义的,则需要添加:
//这里是自定义按钮的点击事件,如果是loginButton 则不需要做操作,
faceLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginManager.getInstance().logInWithReadPermissions(TestActivity.this, Arrays.asList("public_profile"));
}
});
下面的这个文件是我整合google登录的Facebook登录的utils类:
package in.wp.cheetahs.utils;
import android.app.Activity;
import android.os.Bundle;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import org.json.JSONObject;
import java.util.Iterator;
import in.wp.baselib.utils.L;
/**
* create by zj on 2019/9/26
*/
public class ThirdLoginUtils {
private GoogleSignInClient mGoogleSignInClient;
private CallbackManager callbackManager;
private static ThirdLoginUtils thirdLoginUtils;
private Activity activity;
private ThirdLoginUtils(Activity activity){
this.activity=activity;
}
public static ThirdLoginUtils getInstace(Activity activity){
if (thirdLoginUtils==null){
thirdLoginUtils=new ThirdLoginUtils(activity);
}
return thirdLoginUtils;
}
public CallbackManager getCallManager(){
return callbackManager;
}
public GoogleSignInClient getmGoogleSignInClient(){
return mGoogleSignInClient;
}
public void initGoogleClient(){
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(activity, gso);
}
public void initFacebookClient(ThirdLoginCallBack callBack) {
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
AccessToken accessToken = loginResult.getAccessToken();
getFacebookInfo(accessToken,callBack);
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException error) {
}
});
}
public void getFacebookInfo(AccessToken accessToken,ThirdLoginCallBack callBack) {
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,gender,picture");
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (object != null) {
String thirdIco;
String thirdName;
String thirdId;
try {
Iterator iterator = object.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
String value = object.getString(key);
L.e("xx", key + "--" + value);
}
//获取用户头像
JSONObject object_pic = object.optJSONObject("picture");
if (object_pic != null) {
JSONObject object_data = object_pic.optJSONObject("data");
thirdIco = object_data.optString("url");
}else {
thirdIco="";
}
thirdName = object.optString("name");
thirdId = object.optString("id");
if (callBack!=null){
callBack.onFacebookSuccess(thirdId,thirdName,thirdIco);
}
} catch (Exception e) {
}
}
}
});
request.setParameters(parameters);
request.executeAsync();
}
public interface ThirdLoginCallBack{
void onFacebookSuccess(String id,String name,String icon);
}
}
涉及到的一些问题,当我把相关代码拉取到新项目时,会出现api12500的错误。后来发现是firebase中一个设置的问题:
选中项目->project setting->Support email将email添加上即可