CocosCreator 2.4.5 整合FB登入(Android App)
- 承鑫 郭
- 2021年7月15日
- 讀畢需時 2 分鐘
建立FB開發者應用程式


加入FBLogin相依套件
在專案中開啟 your_app > Gradle Scripts > build.gradle(專案),確認 buildscript { repositories {}} 中列出了以下存放庫: jcenter()
在專案中開啟 your_app > Gradle Scripts > build.gradle(模組:應用程式),然後將下列實作陳述式新增至 dependencies{} 區塊以使用最新版的 Facebook 登入 SDK: implementation 'com.facebook.android:facebook-login:[8.1)'
建置您的專案。
編輯資源和 Manifest

將應用程式與您的套件名稱和預設類別建立連結

提供您應用程式的「開發金鑰雜湊」和「發行金鑰雜湊
keytool -exportcert -alias androiddebugkey -keystore ~/.android/xxx.keystore | openssl sha1 -binary | openssl base64
Android 應用程式必須先以發行密鑰雜湊進行數位簽署,才能上傳至商店。若要產生發行密鑰雜湊,請在 Mac 或 Windows 上執行下列指令,並替換成您的發行密鑰別名和 KeyStore 路徑:
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64

實作FB登入的類(由於此類某些方法需要由cocos呼叫, 故呼叫的Fun一定要Static) 僅提供片段
/** 監聽 onActivityResult **/
public static void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "onActivityResult data = " + data.toString());
if (mCallbackManager != null) {
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
}
/** 初始化SDK **/
public static void initSdk(Activity activity) {
Log.i(TAG, "initSdk");
mActivity = activity;
mCallbackManager = CallbackManager.Factory.create();
initLogin();
//initShare();
}
/** 登入初始化 **/
private static void initLogin() {
Log.i(TAG, "initLogin");
LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.e(TAG, "login onSuccess loginResult = " + loginResult.toString());
/** FB登入 **/
/** 因為Cocos呼叫必須為Static **/
public static void facebookLogin() {
Log.i(TAG, "facebookLogin");
if (isAuthorization()) {
//已经授权
requestAuthInfo();
return;
}
Collection<String> permissions =
Arrays.asList("public_profile", "email");
LoginManager.getInstance().logInWithReadPermissions(mActivity, permissions);
}
/** 獲取授權個人訊息 **/
private static void requestAuthInfo() {
Log.i(TAG, "requestAuthInfo");
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest graphRequest = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
Log.e(TAG, "requestAuthInfo onCompleted object = " + object.toString() + " response = " + response.toString());
if (response.getError() != null) {
//授权错误
//通知js
final String eval = String.format("xxx.onFacebookLoginError('%s')", response.getError().getErrorMessage());
Cocos2dxHelper.runOnGLThread(new Runnable() {
@Override
public void run() {
try {
Cocos2dxJavascriptJavaBridge.evalString(eval);
} catch (Exception e) {
e.printStackTrace();
}
}
});
return;
}
//id:1565455221565
String id = object.optString("id");
//昵称:Zhang San
String name = object.optString("name");
//性别:比如 male (男) female (女)
String gender = object.optString("gender");
//邮箱:比如:56236545@qq.com
String email = object.optString("email");
//头像
String picture = "";
JSONObject objPicture = object.optJSONObject("picture");
if (objPicture != null) {
JSONObject objPictureData = objPicture.optJSONObject("data");
if (objPictureData != null) {
picture = objPictureData.optString("url");
}
}
//头像
String avatar = String.format("https://graph.facebook.com/%s/picture?type=large", id);
String authInfo = String.format("{\"id\":\"%s\",\"name\":\"%s\",\"gender\":\"%s\",\"email\":\"%s\",\"picture\":\"%s\",\"avatar\":\"%s\"}",
id, name, gender, email, picture, avatar);
//通知js
final String eval = String.format("xxx.onFacebookLoginSuccess('%s')", authInfo);
Cocos2dxHelper.runOnGLThread(new Runnable() {
@Override
public void run() {
try {
Cocos2dxJavascriptJavaBridge.evalString(eval);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
});
Bundle param = new Bundle();
param.putString("fields", "id,name,gender,email,picture");
graphRequest.setParameters(param);
graphRequest.executeAsync();
}
初始化管理者

監聽主Activity的OnActivityResult()

Cocos呼叫原生
//FB登入
fbLogin: function () {
console.log("Facebook login");
if (cc.sys.isNative) {
if (cc.sys.os == cc.sys.OS_ANDROID) {
let className = "tools/FacebookSdk";
let methodName = "facebookLogin";
let methodSignature = "()V";
jsb.reflection.callStaticMethod(className, methodName, methodSignature);
}
Comments