Android 版 Facebook 登录 — 快速入门
1】首先去Facebook开发者平台创建自己的应用,这里一般是运营的工作。本文主要讲解接入过程以及遇到的一些问题,其他不赘述。
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"/>
正确填入即可
官方文档很坑,直接给了一个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】编译过程遇到的问题可在其他文章中找到解决方案。