Android 集成 Facebook 登录
美国时间10月28日的 Connect 2021 直播活动中,Facebook 创始人马克·扎克伯格正式宣布,公司将更名为“Meta”,不管怎么改咱先接入功能。
???? 创建应用
如果已创建请忽略这一步。
???? 选择受众
???? 选择类型
???? 详情(后面都可以修改)
???? 创建成功(开发中)
用户数据删除:访问用户数据的应用必须为用户提供请求删除数据的方式。你必须提供数据删除请求回调或说明,告知用户如何从你的应用或网站删除自己的数据。如不提供将有应用功能被下架的风险。
???? 添加平台
选中,next。
除了这些其他官方都不认可,上线一段时间后你会受到邮件警告等。
当然其他平台应用(如官网)的包,你可以填写上面12个应用市场的包名。但是生成密钥散列的时候要用对应的包名。Facebook目前认密钥散列,不认包名。
这里咱没有密钥散列先填包名,受到警告先放着。
???? 添加登录功能
然后他会一步一步教你集成Facebook SDK。
???? 设置权限
获取权限
???? 集成Facebook SDK
按照上面指示操作即可,不要下载SDK项目,让你导入的库的版本,那些已经过时了。如让你导入的SDK还是[5,6)
版本,但是Github上面的版本已经12.0.1了。看操作就行,最新项目和导入的哭还是要去GitHub上找。地址下面给到,咱们先集成。
???? 使用 Maven
???? 1.在 build.gradle (Project) 中添加 jcenter()
buildscript { repositories { jcenter() } } 复制代码
???? 2.在 build.gradle (Module: app) 并中添加库
dependencies { implementation 'com.facebook.android:facebook-android-sdk:12.0.1' implementation 'com.facebook.android:facebook-login:12.0.1' } 复制代码
???? 3.构建项目
使用 Facebook 登录 SDK 时,如果未禁用事件自动记录功能,那么系统将自动记录和收集应用事件,以用于 Facebook 分析。(这个功能基本废了)
???? 将软件包名称和默认类与应用进行关联
???? 生成密钥散列
密钥散列(不同电脑生成的可能不同),所以不管生成开发或发布密钥散列时都核实一下,并上传到Facebook。
???? 生成开发密钥散列
每个 Android 开发环境都将会有一个唯一的开发密钥散列(不同电脑生成的可能不同)。Facebook支持上传多个密钥。
Mac OS
需要 Java 开发包中的密钥和证书管理工具 (keytool)。 如要生成开发密钥散列,请打开终端窗口,运行以下命令:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 复制代码
Windows
Java 开发包中的密钥和证书管理工具 (keytool)
Google Code Archive 的 Windows 版 openssl-for-windows OpenSSL 库
如要生成开发密钥散列,请在 Java SDK 文件夹的命令提示符中运行以下命令:
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 复制代码
???? 生成发布密钥散列(发版了)
Android 应用必须先使用发布密钥进行电子签名,然后才能上传到商店中。如要生成发布密钥散列,请在 Mac 或 Windows 内运行以下命令:
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64 复制代码
???? 代码生成
这种生成方式,我经常用。简单省事
try { PackageInfo info = getPackageManager().getPackageInfo( "com.scc.sccmall(你的包名)", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.e("HashKey:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } 复制代码
运行结果:E/HashKey: +HCAQng1tQI5z/lqF2jVThpufHk=
咱们将 +HCAQng1tQI5z/lqF2jVThpufHk= 填入save,继续向下走。
???? 错误提示生成
做登录测试的时候会提示密钥散列不正确,并且会将正确的密钥散列显示出来,填入即可。
???? 配制资源和清单文件
???? 在strings.xml添加资源
刚才获取的应用编号
<string name="facebook_app_id">2992757927647074</string> <string name="fb_login_protocol_scheme">fb2992757927647074</string> 复制代码
???? 在AndroidManifest.xml添加内容
<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> 复制代码
???? 记录应用事件
iOS14 的原因导致应用事件(回传事件时间较长14天左右)无法满足运营需求,故从AppsFlyer回传至Facebook经常分析。
当然如果仅参考或者无时间要求可接入
???? Application 类的 onCreate 方法中添加内容
@Override public void onCreate() { super.onCreate(); FacebookSdk.sdkInitialize(getApplicationContext()); AppEventsLogger.activateApp(this); } 复制代码
???? 购买事件
logger.logPurchase(BigDecimal.valueOf(4.32), Currency.getInstance("USD")); 复制代码
???? 其他事件
public void setEvent(String event) { AppEventsLogger logger = AppEventsLogger.newLogger(MyApp.getAppContext().getTopActivity()); if(event.equals("Complete Registration")) { //这里你可以传入FB定义的Event也可以自定义 //params是你传入的事件参数,可不传 Bundle params = new Bundle(); logger.logEvent(AppEventsConstants.EVENT_NAME_COMPLETED_REGISTRATION, params); }else { logger.logEvent(event); } setAfEvent(event, null); } 复制代码
???? 注册回调
public class MainActivity extends AppCompatActivity { private CallbackManager registerCallback(){ if (callbackManager == null) { callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { AccessToken accessToken = loginResult.getAccessToken(); String userId = accessToken.getUserId(); String token = accessToken.getToken(); MLog.e("onSuccessLogin", "userId:" + userId + "|accessToken:" + token); } @Override public void onCancel() { // App code MLog.e("onCancel"); } @Override public void onError(FacebookException exception) { MLog.e("onError"); } }); } return callbackManager; } private CallbackManager callbackManager; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { registerCallback().onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); } 复制代码
???? 安装FaceBook
已放弃Android WebView的登入方式。
SDK 版本 必须高于 8.2 ,并在登录期间删除登录行为中的任何覆盖(即,使用 LoginBehavior.WEB_VIEW_ONLY)。
所以必须下载FaceBoook进行登录。
???? 开始测试
???? 开发中
可以生成测试账号用于本应用测试。
???? 已上线
我将已上线打开,直接用自己的facebook账号测试。
???? 错误
有的是因为密钥散列输入有误导致的,将她提示的密钥散列添加即可。
有的因为应用刚创建或刚对外,暂未生效,过段时间再尝试。
未设置权限和功能
???? 登入测试
调用SDK方法登入,传入的public_profile 就是我们在上面申请的权限。
public_profile:允许应用在 用户 节点中读取 默认公开资料字段 。系统将自动向所有应用授予此权限。
LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile")); 复制代码
好了,在回调接口中拿到了LoginResult.getAccessToken(),下面是AccessToken的userId和token,齐活。
日志打印:
E/-SCC-onSuccessLogin: userId:600111111111194| accessToken:EAAqh5cEtF2IBAHy4SZBSGTEKKkcLPIBw83Uslk2yKOgZB5iCdDGLiXXXXXXXXXXXXXXXXXXGkN9COLbLAebhqVpyPdq7FEnto2ZB7S8nXzL2U754VZBJ5xfvrnhEJ4mqtYHqHIAO88MRKOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXhqVpD48lZA1zfBejpyfglXQ0kYUIj0S1JeEkKhZAh0KIhAZDZD 复制代码
好了,在回调接口中拿到了LoginResult.getAccessToken(),
???? 应用事件测试
作者:Android帅次
链接:https://juejin.cn/post/7024326268409610247