web-dev-qa-db-fra.com

Authentification Facebook sans bouton de connexion

J'ai suivi certains tutoriels de Facebook API 3.0, notamment les exemples Connexion/Déconnexion et Publier dans le fil. Donc, le login fonctionne de cette façon:

  1. L'application s'ouvre, affiche un fragment qui affiche un bouton de connexion
  2. L'utilisateur clique sur connexion, l'authentification est effectuée via la bibliothèque référencée FacebookSDK (com.facebook.widget.LoginActivity) et le code fourni à l'aide de sessions.
  3. L'utilisateur est redirigé vers l'écran suivant

Je ne veux pas que l'utilisateur se connecte de cette façon. Je veux qu'ils utilisent mon application sans aucun login/enregistrement, puis s'ils cliquent sur une fonctionnalité spécifique de Facebook, par exemple. partager une note sur Facebook, l’application devrait leur demander s’ils permettent à Facebook d’utiliser leur application ou quelque chose du genre, vous connaissez le genre de choses habituelles. Sans cela, j'obtiens un nullpointer dans la fonction publishFeedDialog () car la session est nulle, car aucun login n'a été créé.

Ma question est donc la suivante: comment ignorer le SplashFragment avec le bouton de connexion? Ainsi, lorsque l'utilisateur clique sur une fonctionnalité de Facebook dans mon application, aucun nouvel écran ne s'affiche avec un bouton de connexion, mais uniquement la fenêtre d'authentification Facebook par défaut utilisée par les utilisateurs. à?

48
erdomester

@erdomester, @sromku

Facebook lance le nouveau sdk version 4.x où Session est obsolète,

Il nouveau concept de connexion à partir de facebook

LoginManager et AccessToken - Ces nouvelles classes exécutent Facebook S'identifier

Alors, maintenant, vous pouvez accéder à l’authentification Facebook sans le bouton de connexion

layout.xml

    <Button
            Android:id="@+id/btn_fb_login"
            .../>

MainActivity.Java

private CallbackManager mCallbackManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FacebookSdk.sdkInitialize(this.getApplicationContext());

    mCallbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    Log.d("Success", "Login");

                }

                @Override
                public void onCancel() {
                    Toast.makeText(MainActivity.this, "Login Cancel", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(FacebookException exception) {
                    Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
                }
            });

    setContentView(R.layout.activity_main);

    Button btn_fb_login = (Button)findViewById(R.id.btn_fb_login);

    btn_fb_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
              LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
        }
    });

}

Modifier

Si vous n’ajoutez pas ce qui suit, cela ne fonctionnera pas (signalé à juste titre par @Daniel Zolnai dans le commentaire ci-dessous):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
        return;
    }
}
86
TejaDroid

Quelque chose comme ça

private void performFacebookLogin()
{
    Log.d("FACEBOOK", "performFacebookLogin");
    final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, Arrays.asList("email"));
    Session openActiveSession = Session.openActiveSession(this, true, new Session.StatusCallback()
    {
        @Override
        public void call(Session session, SessionState state, Exception exception)
        {
            Log.d("FACEBOOK", "call");
            if (session.isOpened() && !isFetching)
            {
                Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
                isFetching = true;
                session.requestNewReadPermissions(newPermissionsRequest);
                Request getMe = Request.newMeRequest(session, new GraphUserCallback()
                {
                    @Override
                    public void onCompleted(GraphUser user, Response response)
                    {
                        Log.d("FACEBOOK", "onCompleted");
                        if (user != null)
                        {
                            Log.d("FACEBOOK", "user != null");
                            org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
                            String email = graphResponse.optString("email");
                            String id = graphResponse.optString("id");
                            String facebookName = user.getUsername();
                            if (email == null || email.length() < 0)
                            {
                                Logic.showAlert(
                                        ActivityLogin.this,
                                        "Facebook Login",
                                        "An email address is required for your account, we could not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.");
                                return;
                            }
                        }
                    }
                });
                getMe.executeAsync();
            }
            else
            {
                if (!session.isOpened())
                    Log.d("FACEBOOK", "!session.isOpened()");
                else
                    Log.d("FACEBOOK", "isFetching");

            }
        }
    });

En fait, exactement comme ça. Cela fonctionne parfaitement bien pour moi.

9
WIllJBD

Cela a fonctionné pour moi

    import Android.os.Bundle;
    import Android.app.Activity;
    import Android.content.Intent;
    import Android.widget.TextView;
    import com.facebook.*;
    import com.facebook.model.*;

    public class MainActivity extends Activity {

      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // start Facebook Login
        Session.openActiveSession(this, true, new Session.StatusCallback() {

          // callback when session changes state
          @Override
          public void call(Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {

              // make request to the /me API
              Request.newMeRequest(session, new Request.GraphUserCallback() {

                // callback after Graph API response with user object
                @Override
                public void onCompleted(GraphUser user, Response response) {
                  if (user != null) {
                    TextView welcome = (TextView) findViewById(R.id.welcome);
                    welcome.setText("Hello " + user.getName() + "!");
                  }
                }
              }).executeAsync();
            }
          }
        });
      }

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
      }

    }

si vous devez obtenir des autorisations après avoir vérifié que la session est ouverte, ajoutez cette méthode:

List<String> permissions = session.getPermissions();             
                 Session.NewPermissionsRequest newPermissionsRequest = new         Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
                 session.requestNewReadPermissions(newPermissionsRequest);
3
Dany19

Cette bibliothèque simple peut vous aider: https://github.com/sromku/Android-simple-facebook

Ajoutez simplement cette bibliothèque à votre projet et faites référence de cette bibliothèque à Facebook SDK 3.0.x, puis ajoutez une référence de votre application à cette bibliothèque.

Ensuite, vous pouvez vous connecter sans la LoginButton et effectuer des actions simples comme publier des flux, obtenir un profil/des amis, envoyer une invitation, etc. 

Voici à quoi ressemble le login:

OnLoginOutListener onLoginOutListener = new SimpleFacebook.OnLoginOutListener()
{

    @Override
    public void onFail()
    {
        Log.w(TAG, "Failed to login");
    }

    @Override
    public void onException(Throwable throwable)
    {
        Log.e(TAG, "Bad thing happened", throwable);
    }

    @Override
    public void onThinking()
    {
        // show progress bar or something to the user while login is happening
        Log.i(TAG, "In progress");
    }

    @Override
    public void onLogout()
    {
        // change the state of the button or do whatever you want
        Log.i(TAG, "Logged out");
    }

    @Override
    public void onLogin()
    {
        // change the state of the button or do whatever you want
        Log.i(TAG, "Logged in");
    }
};

// set login/logut listener
mSimpleFacebook.setLogInOutListener(onLoginOutListener);

// do the login action
mSimpleFacebook.login(MainActivity.this);


Ensuite, dans la méthode de rappel onLogin(), vous pouvez publier le flux de la manière suivante:

// build feed
Feed feed = new Feed.Builder()
    .setMessage("Clone it out...")
    .setName("Simple Facebook for Android")
    .setCaption("Code less, do the same.")
    .setDescription("The Simple Facebook library project makes the life much easier by coding less code for being able to login, publish feeds and open graph stories, invite friends and more.")
    .setPicture("https://raw.github.com/sromku/Android-simple-facebook/master/Refs/Android_facebook_sdk_logo.png")
    .setLink("https://github.com/sromku/Android-simple-facebook")
    .build();

// publish the feed
mSimpleFacebook.publish(feed);

J'espère que ça peut t'aider.

2
sromku

Un délai pour accéder aux détails du FB sans utiliser le bouton de connexion est

1) Cacher votre LoginButton UI

2) Ajoutez votre bouton personnalisé

Button signup = (Button) view.findViewById(R.id.btn_signup);
        signup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginButton.performClick();//Where loginButton is Facebook UI
            }
        });

Mais je suggère d'utiliser LoginManager

2
Raghavendra B

Vous pouvez ignorer la boîte de dialogue de connexion à l'aide du module Node powered facebook-proxy . Créez votre propre instance sur Heroku en utilisant le bouton de déploiement en un clic.

Qu'est-ce qu'il fait fondamentalement:

  1. Demande un access_token à Facebook
  2. Ouvre un serveur proxy en utilisant express-http-proxy
  3. Vous permet de demander tous les points de terminaison de l'API
0
redaxmedia