Facebook三方登陆流程
准备工作
- 注册一个facebook账号(注册流程就不说了,不懂百度)
正篇
-
进入Facebook Developer官方网站,登录Facebook账号
ps:如果第一次登陆进来图中框起来的地方是**“新手xx”**忘记截图记不太住了,反正一点进去是一个注册成为Developer,按照步骤注册就行了,注册好之后,就是图中这样,点击我的应用。
这里一步一步的跟着做,就可以实现Facebook三方登录了。
ps:第一步这个下载SDK不下载也行。需要边在AS中编写边在上面的截图每一步中增加一些东西,他会一步一步指导怎么操作
比如这种(后面也还有一些,后面实践中会具体介绍):
实践
实际操作一下,记录下每个步骤。
-
在这里我新建了一个FaceBookDemo项目,包名为:com.askey.dvr.facebookdemo
-
build中加入:
repositories { google() jcenter() mavenCentral() }
implementation 'com.facebook.android:facebook-android-sdk:[4,5)'
implementation 'com.facebook.android:facebook-android-sdk:[8,9)' //目前最新的
-
在网站上的第三步中填写信息:
这里提供一种简单的方式获取(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) {
}
}
* ###### 在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>
-
初始化
FacebookSdk.sdkInitialize(this); AppEventsLogger.activateApp(this);
-
使用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" />
-
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); } };
对代码进行封装请参考:Android 第三方登录集-FaceBook 登录集成
以为这就完了?不还没有
还有一些其他东西
接着看
差不多就这些了吧,官方文档写的都很清楚。