官方文檔
接入準備
1】首先去Facebook開發者平臺創建自己的應用,這裏一般是運營的工作。本文主要講解接入過程以及遇到的一些問題,其他不贅述。
集成SDK
1】Maven方式:
項目級的build.gradle
repositories {
jcenter() //添加
}
應用級的build.gradle
dependencies {
implementation 'com.facebook.android:facebook-login:[5,6)' //添加
2】jar包導入方式
下載Facebook最新的SDK的 jar包,放到項目的libs文件夾下。
下載地址在上方官方文檔中有
編輯您的資源和清單
1】打開您的 /app/res/values/strings.xml 文件。
添加如下所示的代碼:
<resources>
<string name="facebook_app_id">後臺有</string>
<string name="server_client_id">後臺有</string>
</resources>
2】打開 /app/manifest/AndroidManifest.xml 文件。
在 application 元素後添加以下 uses-permission 元素:
<uses-permission android:name="android.permission.INTERNET" />
3】在 application 元素中添加以下 meta-data 元素。 官方文檔添加內容比這多,可以看下。我的項目只添加以下meta-data(添加Facebook的activity會有奇怪的報錯…)
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
將包名填入FB後臺
正確填入即可
生成密鑰散列
官方文檔很坑,直接給了一個debug的生成命令,疏忽的小朋友如果照着文檔執行,測試包不會有問題,但是一旦上線,玩家手機中裝有Facebook應用後,就無法進入遊戲,
提示:登陸錯誤:將你登陸到此應用程序時錯誤,請稍後再試。
所以這裏生成散列要生成兩個,並都填入後臺。
每個 Android 開發環境都將會有一個唯一的開發密鑰散列
打開mac的終端,輸入以下命令就會生成28個字符串的一個散列。
Mac – Debug的:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Mac – 正式的:
keytool -exportcert -alias **YOUR_RELEASE_KEY_ALIAS** -keystore **YOUR_RELEASE_KEY_PATH** | openssl sha1 -binary | openssl base64
YOUR_RELEASE_KEY_ALIAS:看下你的keyAlias是多少,填入
YOUR_RELEASE_KEY_PATH:你的keystore文件路徑
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
以上,在後臺輸入包名,散列後就可以後面愉快的代碼接入了
1】在onCreate()方法中添加回調
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// facebook registerLoginCallback
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code, 登陸成功,自己編寫成功後的方法
//獲取FB返回的uid:loginResult.getAccessToken().getUserId();
}
@Override
public void onCancel() {
// App code, 登陸取消,自行編寫
}
@Override
public void onError(FacebookException exception) {
// App code
Log.e(TAG, "exception: " + exception);
}
});
//檢測登陸狀態,可選功能。 在官方文檔中也有介紹,判斷本地是否有登陸緩存,直接登陸
AccessToken accessToken = AccessToken.getCurrentAccessToken();
isFBLoggedIn = accessToken != null && !accessToken.isExpired();
2】需要登陸的地方添加以下代碼
LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile"));
3】最後,在 onActivityResult 方法中調用 callbackManager.onActivityResult,通過 callbackManager 將登錄結果傳遞至 LoginManager
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
至此,接入完成。
遇到的問題
1】第一個問題玩家無法登陸Facebook賬號,在生成散列中已經說明了。
2】如果提示:“xxxxxxxFacebook-login 5.9.0 in AndroidManifest”,就把清單中的FacebookActivity註釋掉。
3】編譯過程遇到的問題可在其他文章中找到解決方案。