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添加上即可