阅读 278

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

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐