Facebook三方登陆流程

Facebook三方登陆流程

准备工作

  • 注册一个facebook账号(注册流程就不说了,不懂百度)

正篇

在这里插入图片描述

ps:如果第一次登陆进来图中框起来的地方是**“新手xx”**忘记截图记不太住了,反正一点进去是一个注册成为Developer,按照步骤注册就行了,注册好之后,就是图中这样,点击我的应用。

  • 点击创建应用

在这里插入图片描述

  • 按图中所示操作

在这里插入图片描述

在这里插入图片描述

  • 创建好之后就可以看到这样的界面,点击Facebook登录对应的设置

在这里插入图片描述

  • 点击Android

在这里插入图片描述

在这里插入图片描述

这里一步一步的跟着做,就可以实现Facebook三方登录了。

ps:第一步这个下载SDK不下载也行。需要边在AS中编写边在上面的截图每一步中增加一些东西,他会一步一步指导怎么操作

比如这种(后面也还有一些,后面实践中会具体介绍):在这里插入图片描述

实践

实际操作一下,记录下每个步骤。

  1. 在这里我新建了一个FaceBookDemo项目,包名为:com.askey.dvr.facebookdemo
  2. build中加入:
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
    
    implementation 'com.facebook.android:facebook-android-sdk:[4,5)'
    
    implementation 'com.facebook.android:facebook-android-sdk:[8,9)' //目前最新的
    
  3. 在网站上的第三步中填写信息:

在这里插入图片描述

在这里插入图片描述

  1. 这里需要填入一个密匙散列:

在这里插入图片描述

这里提供一种简单的方式获取(java代码方式):

public void getKeyHash() {
    try {
        PackageInfo info = getPackageManager().getPackageInfo("你的包名", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KEYHASH","KEYHASH------" + Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (PackageManager.NameNotFoundException e) {
    
    } catch (NoSuchAlgorithmException e) {
    
    }
}
  1. 这里选择是或者否,根据需要选择

在这里插入图片描述

  1. 根据提示加入代码到相应位置

在这里插入图片描述

 * ###### 在string.xml文件下添加:

   ```xml
   <string name="facebook_app_id">app id</string>
   <string name="fb_login_protocol_scheme">fb+app id</string>
   ```

   建议直接从网站上复制
  • 在AndroidManifest.xml中加入网络权限
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 在application中加入
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />
    //配置对应的FacebookActivity,用于登录跳转Facebook应用
    <activity android:name="com.facebook.FacebookActivity" 
        android:configChanges= "keyboard|keyboardHidden|screenLayout|screenSize|orientation" 
        android:label="@string/app_name" />
    //配置无安装Facebook时,网页跳转界面
    <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>
    
  1. 初始化
    FacebookSdk.sdkInitialize(this);
    AppEventsLogger.activateApp(this);
    
  2. 使用Facebook原生的button(当然也可以自己定义,都一样),用户点击按钮后,就会以LoginManager中设置的权限开始登录,按钮随登录状态变化,并根据用户的身份验证状态显示正确的文本。
    <com.facebook.login.widget.LoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="30dp" />
    
  3. java代码,直接贴代码,解释我也解释不来
    public class MainActivity extends AppCompatActivity {
        
        private static final String TAG = "MainActivity";
        private LoginButton loginButton;
        private  CallbackManager callbackManager;
        
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           
            FacebookSdk.sdkInitialize(this);
            AppEventsLogger.activateApp(this);
            //注册callback
            callbackManager = CallbackManager.Factory.create();
            //官网定义fb按钮的做法
            loginButton = findViewById(R.id.login_button);
            loginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_friends"));
            loginButton.setReadPermissions("email");
            // If using in a fragment
    //        loginButton.setFragment(this);
        
            // Callback registration
            loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
    
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // App code
                    Log.d(TAG, "onSuccess:-----------");
                }
    
                @Override
                public void onCancel() {
                    // App code
                    Log.d(TAG, "onCancel: -----------");
                }
    
                @Override
                public void onError(FacebookException exception) {
                    // App code
                    Log.d(TAG, "onError: -----------");
                }
            });
        
            //用户自定义fb按钮的做法
            LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                //为了响应登录结果,您需要使用 LoginButton 注册回调.
                //如果登录成功,LoginResult 参数将拥有新的 AccessToken 及最新授予或拒绝的权限。
                @Override
                public void onSuccess(final LoginResult loginResult) {
                
                    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject object, GraphResponse response) {
                                    if (object != null) {
                                        String email = object.optString("email");
                                        String firstname = object.optString("first_name");
                                        String lastname = object.optString("last_name");
                                        Log.e("log", "LoginActivity - email----" + email);
                                        Log.e("log", "LoginActivity - getLoginInfo::---" + object.toString());
                                        Log.e("log", "LoginActivity - getLoginInfo::---" + response.toString());
                                        
                                        AccessToken accessToken = loginResult.getAccessToken();
                                        String fbuserId = accessToken.getUserId();
                                        String token = accessToken.getToken();
                                        Log.e("log", "LoginActivity - accessToken:::" + accessToken);
                                        Log.e("log", "LoginActivity - userid:::" + fbuserId);
                                    
                                        if (accessToken != null) {
                                            //如果登录成功,跳转到登录成功界面,拿到facebook返回的email/userid等值,在我们后台进行操作
                                        
                                            // FbLogin();
                                        }
                                    }
                                }
                            });
                
                    //这一段也不知道干嘛
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale," +
                                                           "updated_time,timezone,age_range,first_name,last_name");
                    request.setParameters(parameters);
                    request.executeAsync();
                }
            
                @Override
                public void onCancel() {
                    //  Toast.makeText(LoginActivity.this, "facebook_account_oauth_Cancel", Toast.LENGTH_SHORT).show();
                }
            
                @Override
                public void onError(FacebookException e) {
                    // Toast.makeText(LoginActivity.this, "facebook_account_oauth_Error", Toast.LENGTH_SHORT).show();
                
                }
            });
        }
        
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            callbackManager.onActivityResult(requestCode, resultCode, data);
            super.onActivityResult(requestCode, resultCode, data);
        }
        
        
    }
    

运行起来,点击按钮就是这样:
在这里插入图片描述

简单的使用登录就这样了。

ps:如果你的应用没有上架,那么只能用你申请facebook开发者的那个账号登录,不然会提示没有权限

还有一些

在这里插入图片描述

对于这段,在实际运用中是这样的。自己写一个button。这时候有一个自己写的button和Facebook官方定义的LoginButton,实现自定义登陆

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
        if (isLoggedIn){
            Log.d(TAG, "onClick: ===============");
            LoginManager.getInstance().logOut();
        }else{
            Log.d(TAG, "onClick: --------------------");
            LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile"));
        }
    }
});

我对这段代码的理解就是,简单说就是这两个button的功能其实就是一样的,没登录,点击就是登陆,登陆了,点击就是退出。如果登陆了就会把缓存进AccessToken。

  • 获取用户信息
    profileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
            String id = currentProfile.getId();
            String name = currentProfile.getName();
            Log.d(TAG, "onCurrentProfileChanged: id is : " + id + "name is : " + name);
        }
    };
    

参考博文:facebook第三方登录,看了你不会后悔

Facebook第三方登录

对代码进行封装请参考:Android 第三方登录集-FaceBook 登录集成

以为这就完了?不还没有
还有一些其他东西
接着看
  • 你还可以申请获取用户的其他信息

在这里插入图片描述

  • 应用及流量限制

在这里插入图片描述

  • 增加测试用户在这里插入图片描述

差不多就这些了吧,官方文档写的都很清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值