自定义Facebook登录按钮-Android

自定义Facebook登录按钮-Android,android,facebook,facebook-sdk-4.0,Android,Facebook,Facebook Sdk 4.0,我正在关注这一点,但到目前为止,我无法让它工作,虽然这是一年前左右的事 我正在使用AndroidStudio 1.2.2和FacebookSDK 4 我想使用自定义按钮简单登录facebook,如下图所示: 现在,在教程中的示例中,我遇到了Session变量的问题,它说它无法解决它,而且getActivity() naybody在FacebookSDK4.0上试过这个吗 这是一种正确的方法,还是有更先进的方法 提前谢谢 第1步: 首先添加FrameLayout并使facebook按钮可见性=“

我正在关注这一点,但到目前为止,我无法让它工作,虽然这是一年前左右的事

我正在使用AndroidStudio 1.2.2和FacebookSDK 4

我想使用自定义按钮简单登录facebook,如下图所示:

现在,在教程中的示例中,我遇到了
Session
变量的问题,它说它无法解决它,而且
getActivity()

naybody在FacebookSDK4.0上试过这个吗

这是一种正确的方法,还是有更先进的方法

提前谢谢

第1步: 首先添加FrameLayout并使facebook按钮可见性=“消失”,然后添加自定义按钮。 别忘了放
xmlns:facebook=”http://schemas.android.com/apk/res-auto“
在主布局中

<FrameLayout
        android:id="@+id/FrameLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <com.facebook.login.widget.LoginButton
            android:id="@+id/login_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone" />

        <Button
            android:id="@+id/fb"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#416BC1"
            android:onClick="onClick"
            android:text="FaceBook"
            android:textColor="#ffffff"
            android:textStyle="bold" />
    </FrameLayout>
第4步: 不要忘记添加以下代码

@Override
protected void onActivityResult(int requestCode, int responseCode,
Intent data) {
    super.onActivityResult(requestCode, responseCode, data);
    callbackManager.onActivityResult(requestCode, responseCode, data);
}
第五步: 将自定义按钮单击设置为FacebookLogin按钮单击

public void onClick(View v) {
    if (v == fb) {
        loginButton.performClick();
    }
 }
第6步: 要以编程方式注销,请使用此选项

LoginManager.getInstance().logOut()

步骤7:您可以通过配置文件找到已登录或未登录的用户

profile = Profile.getCurrentProfile().getCurrentProfile();
if (profile != null) {
    // user has logged in
} else {
    // user has not logged in
}

IMO所选答案中有一部分是解决方法不正确的。 因此,需要进行以下更改以使其正确:

  • 从XML中删除“com.facebook.login.widget.LoginButton”

    <com.facebook.login.widget.LoginButton
            android:id="@+id/login_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone" />
    
    
    
  • 去掉Java代码中对“LoginButton”的所有引用

  • 使用Facebook的“LoginManager”类,其用途如下:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Some code
        callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(
            callbackManager,
            new FacebookCallback < LoginResult > () {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // Handle success
                }
    
                @Override
                public void onCancel() {
                }
    
                @Override
                public void onError(FacebookException exception) {
                } 
           }
       );
    }
    
    public void onClick(View v) {
       if (v == fb) {
           LoginManager.getInstance().logInWithReadPermissions(
               this,
               Arrays.asList("user_photos", "email", "user_birthday", "public_profile")
           );
       }
    }
    
    // this part was missing thanks to wesely
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
    //一些代码
    callbackManager=callbackManager.Factory.create();
    LoginManager.getInstance().registerCallback(
    回拨经理,
    新建FacebookCallback(){
    @凌驾
    成功时公共无效(LoginResult LoginResult){
    //成功
    }
    @凌驾
    公开作废{
    }
    @凌驾
    public void onError(facebook异常){
    } 
    }
    );
    }
    公共void onClick(视图v){
    如果(v==fb){
    LoginManager.getInstance().logInWithReadPermissions(
    这
    Arrays.asList(“用户照片”、“电子邮件”、“用户生日”、“公共档案”)
    );
    }
    }
    //多亏了wesely,这一部分不见了
    @凌驾
    受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
    super.onActivityResult(请求代码、结果代码、数据);
    callbackManager.onActivityResult(请求代码、结果代码、数据);
    }
    
  • (没有足够的声誉添加评论…)

    我尝试了@Shehabix的答案,在添加此项之前无法收到回调

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
    
    然后就可以了。

    这很简单。 在布局文件中添加一个按钮,如

    <Button
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:text="Login with facebook"
        android:textColor="#ffff"
        android:layout_gravity="center"
        android:textStyle="bold"
        android:onClick="fbLogin"
        android:background="@color/colorPrimary"/>
    
    
    
    并在onClick中放置LoginManager的registercallback()方法 因为这个方法会自动执行

    比如:

    public void fbLogin(视图)
    {
    //编辑前:
    //LoginManager.getInstance().logInWithReadPermissions(这是数组.asList(“用户照片”、“电子邮件”、“公共配置文件”、“用户帖子”、“AccessToken”));
    LoginManager.getInstance().logInWithReadPermissions(这个,Arrays.asList(“用户照片”、“电子邮件”、“公共配置文件”、“用户帖子”);
    LoginManager.getInstance().logInWithPublishPermissions(这是Arrays.asList(“发布操作”);
    LoginManager.getInstance().registerCallback(callbackManager,
    新建FacebookCallback()
    {
    @凌驾
    成功时公共无效(LoginResult LoginResult)
    {
    //应用程序代码
    }
    @凌驾
    公开作废
    {
    //应用程序代码
    }
    @凌驾
    public void onError(facebook异常)
    {
    //应用程序代码
    }
    });
    }
    
    玩得开心

    简单的答案是添加
    facebookButton.performClick()
    inside
    cutomBtn.setOnClickListener
    
    

    私人登录按钮fb_connect;
    专用线路布局mfb_connect;
    

    //facebook sdk中的按钮
    fb_connect=(登录按钮)findViewById(R.id.fb_connect);
    //处理“从我的自定义按钮单击”以执行操作“单击facebook sdk”按钮
    mfb_connect=(LinearLayout)findViewById(R.id.mfb_connect);
    mfb_connect.setOnClickListener(新视图.OnClickListener(){
    @凌驾
    公共void onClick(视图){
    fb_connect.performClick();
    }
    });
    

    这将实现以下目标:

    作为对Harvi和Shehabix回答的补充,我建议添加此方法,因为它在Firebase Auth中注册身份验证

    应在
    LoginManager
    的“成功时”内调用此方法

    private void handleFacebookAccessToken(AccessToken token) {
    
        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
    
                            //Toast.makeText(MainActivity.this, "Autenticando",Toast.LENGTH_SHORT).show();
    
                        } else {
                            // If sign in fails, display a message to the user.
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            //updateUI(null);
                        }
    
                    }
                });
    }
    
    私有无效handleFacebookAccessToken(AccessToken令牌){
    AuthCredential credential=FacebookAuthProvider.getCredential(token.getToken());
    mAuth.SIGNWITH凭证(凭证)
    .addOnCompleteListener(这是新的OnCompleteListener(){
    @凌驾
    未完成的公共void(@NonNull任务){
    if(task.issusccessful()){
    //Toast.makeText(MainActivity.this,“Autenticando”,Toast.LENGTH_SHORT.show();
    }否则{
    //如果登录失败,则向用户显示消息。
    Toast.makeText(MainActivity.this,“身份验证失败”,
    吐司,长度(短)
    
      public void fbLogin(View view)
    {
        // Before Edit:
        // LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts" , "AccessToken"));
    
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts"));
        LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList("publish_actions"));
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>()
                {
                    @Override
                    public void onSuccess(LoginResult loginResult)
                    {
                        // App code
                    }
    
                    @Override
                    public void onCancel()
                    {
                        // App code
                    }
    
                    @Override
                    public void onError(FacebookException exception)
                    {
                        // App code
                    }
                });
    }
    
    private void handleFacebookAccessToken(AccessToken token) {
    
        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
    
                            //Toast.makeText(MainActivity.this, "Autenticando",Toast.LENGTH_SHORT).show();
    
                        } else {
                            // If sign in fails, display a message to the user.
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            //updateUI(null);
                        }
    
                    }
                });
    }
    
    try this 
    
    // Facebook Button
    LoginButton loginButton = findViewById(R.id.loginbtn);
    
    
    // Your Custom Button
    
     binding.fbBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    loginButton.callOnClick();
                }
            });
    
    public class SignInFragment extends Fragment implements
    > FragmentChangeListener{
    >     private Button facebook;
    
    private FirebaseAuth firebaseAuth;
    private CallbackManager mCallBackManager;
    private LoginButton loginButton;
    
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_sign_in, container, false);
    
        facebook = view.findViewById(R.id.facebookButton);
        loginButton = view.findViewById(R.id.facebookBtn);
    
        firebaseAuth = FirebaseAuth.getInstance();
    
        facebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginButton.callOnClick();
            }
        });
    
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCallBackManager = CallbackManager.Factory.create();
                loginButton.setFragment(SignInFragment.this);
                loginButton.setPermissions("email","public_profile");
                loginButton.registerCallback(mCallBackManager, new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        handleFacebookAccessToken(loginResult.getAccessToken());
                    }
    
                    @Override
                    public void onCancel() {
                        Toast.makeText(getContext(),"Is Cancelled",Toast.LENGTH_LONG).show();
                    }
    
                    @Override
                    public void onError(FacebookException error) {
                        Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
                    }
                });
            }
        });
    
        return view;
    }
    
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        mCallBackManager.onActivityResult(requestCode, resultCode, data);
    
    }
    
    private void handleFacebookAccessToken(AccessToken token) {
        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        firebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            FirebaseUser user = firebaseAuth.getCurrentUser();
                            startActivity(new Intent(getContext(),MainActivity.class));
                        } else {
                            // If sign in fails, display a message to the user.
                            Toast.makeText(getContext(), task.getException().getMessage(),
                                    Toast.LENGTH_SHORT).show();
                        }
    
                    }
                });
    }