Google登录和facebook登录相关

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,以及秘钥散列。
秘钥散列可根据提供的秘钥散列库中的工具获取:

openssl-for-windows

获取命令如下:

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添加上即可
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值