Подтвердить что ты не робот

Аутентификация Facebook без кнопки входа в систему

Я следил за некоторыми учебниками по API Facebook 3.0, включая примеры входа/выхода из системы и примеры публикации в фиде. Таким образом, логин работает следующим образом:

  • Приложение открывается, показывает фрагмент, который отображает кнопку входа в систему
  • Пользователь нажимает логин, аутентификация выполняется через указанную библиотеку FacebookSDK (com.facebook.widget.LoginActivity) и предоставленный код с использованием сеансов.
  • Пользователь перенаправляется на следующий экран

Я не хочу, чтобы пользователь заходил так. Я хочу, чтобы они использовали мое приложение без регистрации/регистрации, затем, если они нажимают на специальную функцию facebook, например. поделитесь запиской на Facebook, тогда приложение должно спросить их, позволяют ли Facebook использовать их приложение или что-то еще, вы знаете обычные вещи. Без этого я получаю nullpointer в функции publishFeedDialog(), поскольку сеанс имеет значение null, поскольку вход не был выполнен.

Итак, мой вопрос: как я могу игнорировать SplashFragment с помощью кнопки "Логин", поэтому, когда пользователь нажимает на функцию Facebook в моем приложении, новый экран не отображается с помощью кнопки входа в систему, а только окно проверки подлинности Facebook по умолчанию, которое пользователи используются?

4b9b3361

Ответ 1

@erdomester, @sromku

Facebook запустит новую версию sdk 4.x, где Session устарел,

Появилась новая концепция входа в систему как из facebook

LoginManager и AccessToken - Эти новые классы выполняют Facebook Войти

Итак, теперь вы можете получить доступ к аутентификации Facebook без кнопки входа в систему как

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

}

Изменить

Если вы не добавите следующее, это не сработает (правильно указано @Daniel Zolnai в комментарии ниже):

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

Ответ 2

Что-то вроде этого

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

            }
        }
    });

Собственно точно так. Это прекрасно работает для меня.

Ответ 3

Это сработало для меня

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

    }

если вам нужно получить авторизацию после проверки того, что сеанс открыт, добавьте этот способ:

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

Ответ 4

Эта простая библиотека может вам помочь: https://github.com/sromku/android-simple-facebook

Просто добавьте эту библиотеку в свой проект и сделайте ссылку из этой библиотеки на Facebook SDK 3.0.x и добавьте ссылку из вашего приложения в эту библиотеку.

Затем вы можете войти в систему без LoginButton и выполнять простые действия, такие как публикация фидов, получение профиля/друзей, отправка приглашения и многое другое.

Вот как выглядит логин:

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


Затем в методе обратного вызова onLogin() вы можете публиковать фид следующим образом:

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

Надеюсь, это поможет вам.

Ответ 5

A Turnaroubd для доступа к данным FB с использованием LoginButton

1) Скрыть свой пользовательский интерфейс LoginButton

2) Добавьте свою пользовательскую кнопку

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

Но я предлагаю использовать LoginManager

Ответ 6

Вы можете обойти диалоговое окно входа в систему с помощью Node приведенного в действие facebook-proxy. Создайте свой собственный экземпляр на Heroku, используя кнопку с одним щелчком мыши.

Что это в основном делает:

  • Запросит access_token из Facebook
  • Открывает прокси-сервер с помощью express-http-proxy
  • Позволяет запросить все конечные точки API