天天看点

Android——第三方Facebook授权登录获取用户信息

由于项目中需要使用Facebook进行一键登录,所以记录下步骤,其实小伙伴直接看官网也可以,介绍的蛮详细的,先看下效果图吧。

Android——第三方Facebook授权登录获取用户信息

遵循以下步骤将Facebook登录添加到您的应用。

Facebook开发者网站:https://developers.facebook.com/apps/

1.选择应用或新建应用

选择应用或新建应用,将应用相关信息输入以下代码片段。

Android——第三方Facebook授权登录获取用户信息

2.下载Facebook应用

点击下方的按钮,下载Facebook应用。

下载Android版Facebook

3.集成的Facebook SDK

Android版Facebook登录SDK是Android版Facebook SDK的一个组件。如要在您的项目中使用Facebook登录SDK,请转变为Maven中的一个依赖项,或者将其下载下来。如需在Android 11中支持这些更改,请使用SDK版本8.1或更高版本。

使用Maven

  1. 在您的项目中,打开your_app > Gradle脚本> build.gradle(Project),确保以下存储库都添加到

    buildscript { repositories {}}

    中:
jcenter () 
           
  1. 在您的项目中,打开your_app > Gradle脚本> build.gradle(模块:app)依次执行语句添加到

    dependencies{}

    部分,踩依赖于最新版的Facebook登录SDK:
implementation 'com.facebook.android:facebook-login:[8.1)'
           
  1. 构建项目。

    使用 Facebook 登录 SDK 时,如果未禁用事件自动记录功能,那么系统将自动记录和收集应用事件,以用于 Facebook 分析。关于哪些信息会被收集以及如何禁用事件自动记录的详细信息,请参阅应用事件自动记录。

4.编辑您的资源和清单

如果您使用 Android 版 Facebook SDK 版本 5.15 或更高版本,则不需要为 Chrome 自定义选项卡添加活动或意图筛选条件。此功能包含在 SDK 中。

为您的 Facebook 应用编号以及启用 Chrome 自定义选项卡所需的 Facebook 应用编号创建字符串。另外,请将 FacebookActivity 添加到您的 Android 清单文件中。

1.打开您的 /app/res/values/strings.xml 文件。

2.添加如下所示的代码:

<string name="facebook_app_id">你的项目生成的ID</string> 
<string name="fb_login_protocol_scheme">fb你的项目生成的ID</string>
           

3.打开 /app/manifest/AndroidManifest.xml 文件。

4.在 application 元素后添加以下 uses-permission 元素:

<uses-permission android:name="android.permission.INTERNET"/>
           

5.在 application 元素中添加以下 meta-data 元素、一个针对 Facebook 的 activity 元素以及一个针对 Chrome 自定义选项卡的 activity 元素和意向筛选条件:

<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>
           

5.将软件包名称和默认类与应用进行关联

软件包名称

软件包名称是 Android 应用的唯一标识。如果用户未下载您的应用,我们就会使用此名称让他们能在 Google Play 找到应用并下载。您可以在 Android Manifest 文件或应用的 build.gradle 文件中找到此信息。

你项目的包名
           

默认活动类名称

这是处理深度链接的 activity(如 com.example.app.DeepLinkingActivity)的完整且合格的类名称。从 Facebook 应用深度链接至您的应用时,我们就会使用此名称。您也可以在 Android 清单文件中找到该名称。

activity的路径信息
           

6.为应用提供开发和发布密钥散列

为确保您的应用和 Facebook 之间互动的真实性,您需要向我们提供适用于您开发环境的 Android 密钥散列。如果您的应用已经发布,则还应该添加发布密钥散列。

生成开发密钥散列

每个 Android 开发环境都将会有一个唯一的开发密钥散列。

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
           

此命令将针对您的开发环境生成一个包含 28 个字符的唯一密钥散列。将其复制粘贴到下方字段中。您需要向每位应用开发人员的开发环境分别提供开发密钥散列。

生成发布密钥散列

Android 应用必须先使用发布密钥进行电子签名,然后才能上传到商店中。如要生成发布密钥散列,请在 Mac 或 Windows 内运行以下命令,并替换您的发布密钥别名和密钥库路径:

keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64
           

这会生成一个包含 28 个字符的字符串,您应将其复制粘贴到下方字段中。另外,请参阅 Android 文档,了解有关应用签名的信息,也可以代码获取,这样更简单。

try {
            int i = 0;
            PackageInfo info = getPackageManager().getPackageInfo( getPackageName(),  PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                i++;
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
                //KeyHash 就是你要的,不用改任何代码  复制粘贴 ;
                Log.e("获取应用KeyHash", "KeyHash: " + KeyHash);
            }
        }
        catch (Exception e) {
        }
           
Android——第三方Facebook授权登录获取用户信息

7.为应用启用单点登录

启用单点登录

如果您想为 Android 通知添加启动应用的功能,请启用单点登录。

8.添加 Facebook“登录”按钮

向应用添加“Facebook 登录”按钮的最简单方法是从 SDK 添加 LoginButton。LoginButton 是一个界面元素,其中包含 LoginManager 具备的功能。用户点击按钮后,就会以 LoginManager 中设置的权限开始登录。按钮随登录状态变化,并根据用户的身份验证状态显示正确文本。

要添加 Facebook 登录按钮,请先将其添加到布局 XML 文件中:(官网中提供了Facebook SDK内置的登录按钮,但大部分开发中,我们都是有自己的一套UI,所以我就只介绍自定义登录按钮的流程了。)

<LinearLayout
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_margin="20dp"
        android:background="@drawable/bg_button"
        android:gravity="center"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:text="Facebook登录"
            android:textColor="@color/white"
            android:textSize="19sp"
            tools:ignore="HardcodedText" />
</LinearLayout>
           

9.注册回调

现在调用 CallbackManager.Factory.create,创建 callbackManager,以便处理登录响应。

callbackManager = CallbackManager.Factory.create();
           

下面是完整代码:

public class MainActivity extends AppCompatActivity {

    private ImageView tx_PictureUrl;
    private TextView tx_DisplayName;
    private TextView tx_UserId;
    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tx_PictureUrl = findViewById(R.id.tx_PictureUrl);
        tx_DisplayName = findViewById(R.id.tx_DisplayName);
        tx_UserId = findViewById(R.id.tx_UserId);
        callbackManager = CallbackManager.Factory.create();
        LinearLayout loginButton = findViewById(R.id.btn_login);
        loginButton.setOnClickListener(v -> LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile", "user_friends")));
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

            @Override
            public void onCancel() {
                CookieSyncManager.createInstance(MainActivity.this);
                CookieManager cookieManager = CookieManager.getInstance();
                cookieManager.removeAllCookie();
                CookieSyncManager.getInstance().sync();
            }

            @Override
            public void onError(FacebookException arg0) {
                Log.d("onError", arg0.toString());
            }

            @Override
            public void onSuccess(LoginResult arg0) {
                Log.d("onSuccess", "登录成功!");
                updateUI();
            }
        });
    }

    @SuppressLint("SetTextI18n")
    private void updateUI() {
        boolean enableButtons = AccessToken.getCurrentAccessToken() != null;
        Profile profile = Profile.getCurrentProfile();
        if (enableButtons && profile != null) {
            Glide.with(MainActivity.this).load(profile.getProfilePictureUri(150, 150).toString()).into(tx_PictureUrl);
            tx_DisplayName.setText("昵称:" + profile.getName());
            tx_UserId.setText("UserId:" + AccessToken.getCurrentAccessToken().getUserId());
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode,
                resultCode, data);
    }


    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }
}
           

注意:如果应用没有发布的话,只有开发者和测试者可以访问,因为是测试的账号发布了几次还是失败,所以暂时还未发布。

继续阅读