繁体   English   中英

自定义 Facebook 登录按钮 - Android

[英]Custom Facebook Login Button - Android

我正在关注本教程,但到目前为止我无法使其工作,尽管这是一年前左右......

我正在使用 androidStudo 1.2.2 和 FacebookSDK 4。

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

例子

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

有没有人在 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>

第 2 步:在影响布局之前在onCreate初始化FacebookSdk

FacebookSdk.sdkInitialize(this.getApplicationContext());

第 3 步:将其添加到您的 java 文件中。

callbackManager = CallbackManager.Factory.create();

fb = (Button) findViewById(R.id.fb);
loginButton = (LoginButton) findViewById(R.id.login_button);

List < String > permissionNeeds = Arrays.asList("user_photos", "email",
    "user_birthday", "public_profile", "AccessToken");
loginButton.registerCallback(callbackManager,
new FacebookCallback < LoginResult > () {@Override
    public void onSuccess(LoginResult loginResult) {

        System.out.println("onSuccess");

        String accessToken = loginResult.getAccessToken()
            .getToken();
        Log.i("accessToken", accessToken);

        GraphRequest request = GraphRequest.newMeRequest(
        loginResult.getAccessToken(),
        new GraphRequest.GraphJSONObjectCallback() {@Override
            public void onCompleted(JSONObject object,
            GraphResponse response) {

                Log.i("LoginActivity",
                response.toString());
                try {
                    id = object.getString("id");
                    try {
                        URL profile_pic = new URL(
                            "http://graph.facebook.com/" + id + "/picture?type=large");
                        Log.i("profile_pic",
                        profile_pic + "");

                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }
                    name = object.getString("name");
                    email = object.getString("email");
                    gender = object.getString("gender");
                    birthday = object.getString("birthday");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        Bundle parameters = new Bundle();
        parameters.putString("fields",
            "id,name,email,gender, birthday");
        request.setParameters(parameters);
        request.executeAsync();
    }

    @Override
    public void onCancel() {
        System.out.println("onCancel");
    }

    @Override
    public void onError(FacebookException exception) {
        System.out.println("onError");
        Log.v("LoginActivity", exception.getCause().toString());
    }
});

第 4 步:不要忘记添加以下代码。

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

第 5 步:将您的自定义按钮点击设置为 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部分是一种变通方法,而不是正确的解决方案。 因此,需要更改以使其正确的是以下内容:

  1. 从您的 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" />
  2. 删除 Java 代码中对“LoginButton”的所有引用

  3. 使用 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); }

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

<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(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
                }
            });
}

玩得开心

(没有足够的声誉来添加评论......)

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

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

然后它工作正常。

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

    <!-- connect with Facebook -->
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <com.facebook.login.widget.LoginButton
            android:id="@+id/fb_connect"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:textSize="@dimen/login_fb_font_size"
            android:visibility="invisible" />

        <LinearLayout
            android:id="@+id/mfb_connect"
            style="@style/facebook_button">

            <ImageView
                style="@style/login_connect_icon"
                android:src="@drawable/ic_facebook" />

            <TextView
                style="@style/login_connect_text"
                android:text="@string/login_connect_facebook" />
        </LinearLayout>
    </RelativeLayout>

...

private LoginButton fb_connect;
private LinearLayout mfb_connect;

...

    // the button from facebook sdk
    fb_connect = (LoginButton) findViewById(R.id.fb_connect);
    // handle the click from my custom button to perfrom action click on facebook sdk button
    mfb_connect = (LinearLayout) findViewById(R.id.mfb_connect);
    mfb_connect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fb_connect.performClick();
        }
    });

这将实现这一点:

在此处输入图片说明

补充 Harvi 和 Shehabix 的答案,我建议添加此方法,因为这会在 Firebase Auth 中注册身份验证。

这个方法应该在LoginManager “On Success”中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);
                    }

                }
            });
}

我只是从我的自定义按钮调用 facebook 默认按钮,并将每一行代码保留为文档。 并成功运行。

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(); } } }); }

}

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();
            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM