web-dev-qa-db-fra.com

Bouton de connexion Facebook personnalisé - Android

Je suis ceci Tutorial mais jusqu'ici je ne peux pas le faire fonctionner, bien que cela soit d'un an ou plus ...

J'utilise androidStudo 1.2.2 et FacebookSDK 4.

Je souhaite une connexion simple à Facebook à l'aide d'un bouton personnalisé, similaire à celui présenté dans cette image:

Example

Maintenant, dans l'exemple du tutoriel, j'ai des problèmes avec la variable Session, il est dit qu'il ne peut pas le résoudre, ni getActivity()

Est-ce que quelqu'un a déjà essayé sur FacebookSDK4.0?

Est-ce une approche correcte ou peut-être qu'il y a quelque chose de plus à jour?

Merci d'avance!

46
NeoVe

Étape 1: Ajoutez d'abord FrameLayout et faites en sorte que le bouton facebook soit visible = "disparu" et ajoutez votre bouton personnalisé. N'oubliez pas de mettre xmlns:facebook="http://schemas.Android.com/apk/res-auto" dans votre mise en page principale.

<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>

Étape 2: Initialisez FacebookSdk dans onCreate avant d’infléchir la mise en page.

FacebookSdk.sdkInitialize (this.getApplicationContext ());

Étape 3: ajoutez ceci dans votre fichier 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());
    }
});

Étape 4: N'oubliez pas d'ajouter le code suivant.

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

Étape 5: Définissez votre bouton personnalisé, cliquez sur FacebookLogin.

public void onClick(View v) {
    if (v == fb) {
        loginButton.performClick();
    }
 }

Étape 6: Pour la déconnexion par programme, utilisez ceci.

LoginManager.getInstance (). LogOut ();

Étape 7: vous pouvez trouver un utilisateur connecté ou non par profil.

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

IMO une partie de la réponse sélectionnée est une sorte de solution de contournement pas la solution appropriée. Donc, ce qui doit être changé pour le rendre approprié est le suivant:

  1. Débarrassez-vous de "com.facebook.login.widget.LoginButton" dans votre XML

    <com.facebook.login.widget.LoginButton
            Android:id="@+id/login_button"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:visibility="gone" />
    
  2. Supprimez toutes les références au "LoginButton" dans votre Java code

  3. tilisez la classe "LoginManager" de Facebook qui existe à cet effet comme suit:

    @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);
    }
    
80
Shehabic

C'est très simple. Ajouter un bouton dans le fichier de mise en page comme

<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"/>

Et dans la zone onClick, la méthode registercallback () de LoginManager indique que cette méthode s'exécute automatiquement.

comme:

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

S'amuser

14
Harpreet Singh

(ne pas avoir assez de réputation pour ajouter un commentaire ...)

J'ai essayé la réponse de @ Shehabix, je ne peux pas recevoir de rappel jusqu'à ce que j'ajoute ceci

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

alors cela fonctionne bien.

10
Wesely

La réponse simple est add facebookButton.performClick() inside cutomBtn.setOnClickListener

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

Cela permettra d'atteindre ceci:

enter image description here

7
Biskrem Muhammad

Pour compléter les réponses de Harvi et Shehabix, je suggérerais d’ajouter cette méthode car elle enregistre l’authentification dans Firebase Auth.

Cette méthode doit être appelée dans "En cas de succès" de 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);
                    }

                }
            });
}
1
Thiago Silva