wake-up-neo.net

Facebook-Authentifizierung ohne Login-Button

Ich habe einige Facebook API 3.0-Tutorials befolgt, einschließlich der Beispiele Login/Logout und Publish To Feed. Der Login funktioniert also so:

  1. App öffnet sich, zeigt ein Fragment, das eine Login-Schaltfläche anzeigt
  2. Der Benutzer klickt auf Login. Die Authentifizierung erfolgt über die referenzierte FacebookSDK-Bibliothek (com.facebook.widget.LoginActivity) und den bereitgestellten Code mithilfe von Sitzungen.
  3. Der Benutzer wird zum nächsten Bildschirm weitergeleitet

Ich möchte nicht, dass sich der Benutzer auf diese Weise anmeldet. Ich möchte, dass sie meine App ohne Anmeldung/Registrierung verwenden. Wenn sie dann auf eine Facebook-spezifische Funktion klicken, z. Teilen Sie eine Notiz auf Facebook, dann sollte die App sie fragen, ob sie Facebook die Verwendung ihrer App zulassen oder so. Sie kennen das übliche Zeug. Ohne dies bekomme ich einen nullpointer in der publishFeedDialog () - Funktion, da session null ist, da keine Anmeldung erfolgt ist.

Meine Frage ist also, wie ich SplashFragment mit der Login-Schaltfläche ignorieren kann. Wenn der Benutzer in meiner App auf eine Facebook-Funktion klickt, wird mit einer Login-Schaltfläche kein neuer Bildschirm angezeigt, sondern nur das von Facebook verwendete Standard-Authentifizierungsfenster zu?

48
erdomester

@erdomester, @sromku

Facebook lanciert die neue SDK-Version 4.x, in der die Session veraltet ist.

Es gibt ein neues Login-Konzept wie von Facebook

LoginManager und AccessToken - Diese neuen Klassen führen Facebook .__ aus. Anmeldung

So können Sie jetzt auch ohne Login-Button auf die Facebook-Authentifizierung zugreifen

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

}

Bearbeiten

Wenn Sie Folgendes nicht hinzufügen, funktioniert es nicht (richtig von @Daniel Zolnai in Kommentar unten angegeben):

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

Etwas wie das

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

            }
        }
    });

Eigentlich genau so. Es funktioniert perfekt für mich.

9
WIllJBD

Das hat bei mir funktioniert

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

    }

wenn Sie nach dem Öffnen der Sitzung Autorisierungen benötigen, fügen Sie diese hinzu:

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

Diese einfache Bibliothek kann Ihnen helfen: https://github.com/sromku/Android-simple-facebook

Fügen Sie diese Bibliothek einfach zu Ihrem Projekt hinzu, stellen Sie die Referenz aus dieser Bibliothek auf Facebook SDK 3.0.x und fügen Sie der Bibliothek eine Referenz aus Ihrer App hinzu.

Dann können Sie sich ohne LoginButton anmelden und einfache Aktionen ausführen, z. B. Feeds veröffentlichen, Profil/Freunde abrufen, Einladung senden und vieles mehr. 

So sieht das Login aus:

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


Dann können Sie in der onLogin()-Rückmeldungsmethode den Feed wie folgt veröffentlichen:

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

Ich hoffe es kann dir helfen.

2
sromku

Eine Umkehrung des Zugriffs auf die FB-Details ist ohne Login-Button möglich

1) Verstecken Sie Ihre LoginButton-Benutzeroberfläche

2) Fügen Sie Ihren benutzerdefinierten Button hinzu

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

Ich schlage jedoch vor, LoginManager zu verwenden

2
Raghavendra B

Sie können den Anmeldedialog mithilfe des Moduls Node powered facebook-proxy umgehen. Erstellen Sie Ihre eigene Instanz in Heroku, indem Sie die Schaltfläche mit einem Klick verwenden.

Was macht es grundsätzlich:

  1. Fordert einen access_token von Facebook an
  2. Öffnet einen Proxyserver mit express-http-proxy
  3. Lassen Sie uns alle Endpunkte der API anfordern
0
redaxmedia