到这里,我就当读者是了解了Facebook登录需要的操作,由于上传图片崩溃,缺了一些退出登录的代码,现在发布的都是历史版本。。。
一、Facebook登录官方提供了两种方式
- SDK内的LoginButton + 注册 + 回调
- 自定义带点击事件的控件 + 注册 + 回调
二、两者的区别
- 效果上:
前者会调起Facebook登录的确认窗,会让用户点击同意;
后者在本机Facebook没有账号登录时,会跳转至APP登录,有则直接登录
- 代码上:
前者在xml使用LoginButton控件,在onCreate注册 + 回调;
后者在xml自定义点击控件,在点击事件里注册 + 回调。
其实就多一行注册代码而已 !
- 注意:前者在onCreate注册的代码必须在setContentView之前
三、下面贴上效果和代码
-
Facebook没有登录时
-
Facebook登录时
1、第一种登录方式
<!--在xml里,属性自己随容器修改-->
<com.facebook.login.widget.LoginButton
android:id="@+id/login_button"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="60dp"/>
// Activity里,在setContentView之前
public class MainActivity extends AppCompatActivity {
private CallbackManager callbackManager;
private LoginButton loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// TODO
System.out.println("登录成功");
Toast.makeText(MainActivity.this, "登录成功", 0).show();
// 这个类是提供用户信息获取的
ProfileTracker profileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
if (currentProfile != null) {
Log.e("MainActivity",currentProfile.getFirstName());
}
}
};
}
@Override
public void onCancel() {
// App code
System.out.println("取消登录");
Toast.makeText(MainActivity.this, "取消登录", 0).show();
}
@Override
public void onError(FacebookException exception) {
// App code
System.out.println("登录失败");
Toast.makeText(MainActivity.this, "登录失败", 0).show();
}
});
setContentView(R.layout.activity_main);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 回调必须要有
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
2、第二种登录方式
<!--这里随便弄了一个跟原按钮一样的效果>
<TextView
android:id="@+id/tv_login_facebook"
android:text="Continue with Facebook"
android:textAllCaps="false"
android:textSize="18sp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="3dp"
android:paddingBottom="3dp"
android:layout_marginBottom="30dp"
android:drawablePadding="7dp"
android:drawableStart="@drawable/com_facebook_button_icon_white"
android:textColor="@color/com_facebook_button_text_color"
android:background="@drawable/com_facebook_button_login_background"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
callbackManager = CallbackManager.Factory.create();
findViewById(R.id.tv_login_facebook).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 实际上就是多了这样一个提交注册操作
LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile"));
}
});
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Toast.makeText(MainActivity.this, "登录成功", 0).show();
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
Toast.makeText(MainActivity.this, "登录失败", 0).show();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}