Uwierzytelnianie Facebook bez przycisku logowania

Śledziłem kilka samouczków Facebook API 3.0, w tym Login/Wyloguj I Publish to Feed przykłady. Więc login działa w ten sposób:

  1. otwiera się aplikacja, pokazuje fragment, który wyświetla przycisk logowania
  2. użytkownik klika login, uwierzytelnianie odbywa się za pośrednictwem wymienionej Biblioteki FacebookSDK (com.facebook.widget.LoginActivity) oraz dostarczony kod wykorzystujący sesje.
  3. Użytkownik zostaje przekierowany do następnego ekranu

Nie chcę zmuszać użytkownika do zalogowania się do tego sposób. Facebook facebook facebook, to aplikacja powinna zapytać ich, czy pozwalają Facebook korzystać z ich aplikacji, czy coś, wiesz, zwykłe rzeczy.jeśli chcesz, aby korzystać z mojej aplikacji bez logowania/rejestracji, a następnie kliknij na Facebooku konkretnej funkcji, np. udostępnić notatkę na Facebooku, to aplikacja powinna zapytać ich, czy pozwalają Facebook korzystać z ich aplikacji, czy coś, wiesz, zwykłe rzeczy. Bez tego dostaję nullpointer w funkcji publishFeedDialog (), ponieważ sesja jest null, ponieważ nie dokonano logowania.

Więc moje pytanie brzmi, Jak mogę zignorować SplashFragment z przyciskiem Login, więc gdy użytkownik kliknie na Funkcja Facebook Facebook w mojej aplikacji żaden nowy ekran nie jest wyświetlany za pomocą przycisku logowania, ale tylko domyślne okno uwierzytelniania Facebooka, do którego użytkownicy są przyzwyczajeni?

Author: sromku, 2013-08-09

6 answers

@erdomester, @sromku

Facebook uruchamia nowe sdk w wersji 4.x gdzie sesja jest przestarzała,

Tam nowa koncepcja logowania z facebook

LoginManager i AccessToken - te nowe klasy wykonują Facebook Login

Więc teraz możesz uzyskać dostęp do uwierzytelniania Facebook bez przycisku logowania jako

układ.xml

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

główna aktywność.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"));
        }
    });

}

Edit

Jeśli nie dodasz po, to nie zadziała (słusznie zauważył @Daniel Zolnai w komentarzu poniżej):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
        return;
    }
}
 84
Author: TejaDroid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:56

Coś takiego

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

            }
        }
    });
Dokładnie tak. Dla mnie działa idealnie.
 9
Author: WIllJBD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 16:02:15

To zadziałało dla mnie

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

    }

Jeśli chcesz uzyskać autoryzację po sprawdzeniu ,że sesja jest otwarta, Dodaj w ten sposób:

List<String> permissions = session.getPermissions();             
                 Session.NewPermissionsRequest newPermissionsRequest = new         Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
                 session.requestNewReadPermissions(newPermissionsRequest);
 3
Author: Dany19,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 20:39:33

Ta prosta biblioteka może Ci pomóc: https://github.com/sromku/android-simple-facebook

Wystarczy dodać tę bibliotekę do swojego projektu i dokonać odniesienia z tej biblioteki do Facebook SDK 3.0.x i dodać odniesienie z aplikacji do tej biblioteki.

Następnie możesz zalogować się bez LoginButton i wykonywać proste czynności, takie jak publikowanie kanałów, zdobywanie profilu/znajomych, wysyłanie zaproszeń i wiele innych.

Tak wygląda 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);


Następnie w metodzie callback onLogin() możesz opublikować kanał tak:

// 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);
Mam nadzieję, że ci pomoże.
 2
Author: sromku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 16:19:37

Zwrot w celu uzyskania dostępu do szczegółów FB przy użyciu LoginButton to

1)Ukryj swój LoginButton UI

2) Dodaj swój niestandardowy przycisk

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

Ale proponuję użyć LoginManager

 2
Author: Raghavendra B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-12 06:08:41

Możesz ominąć okno logowania za pomocą modułu node powered facebook-proxy. Utwórz własną instancję w Heroku za pomocą przycisku wdrażania jednym kliknięciem.

Co to w zasadzie robi:

  1. Prośba o access_token z Facebook
  2. otwiera serwer proxy za pomocą express-http-proxy
  3. poproś o wszystkie punkty końcowe API
 0
Author: redaxmedia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 22:18:43