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添加上即可
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章