51

我遵循了一些 Facebook API 3.0 教程,包括登录/注销和发布到 Feed 示例。所以登录是这样工作的:

  1. 应用程序打开,显示一个显示登录按钮的片段
  2. 用户单击登录,身份验证通过引用的 FacebookSDK 库 (com.facebook.widget.LoginActivity) 和使用会话提供的代码完成。
  3. 用户被重定向到下一个屏幕

我不想让用户以这种方式登录。我希望他们在没有任何登录/注册的情况下使用我的应用程序,然后如果他们点击 Facebook 的特定功能,例如在 Facebook 上分享便条,那么应用程序应该询问他们是否让 Facebook 使用他们的应用程序或其他东西,你知道通常的东西. 没有这个,我在 publishFeedDialog() 函数中得到一个空指针,因为会话为空,因为没有登录。

所以我的问题是,我怎样才能忽略带有登录按钮的 SplashFragment,所以当用户单击我的应用程序中的 Facebook 功能时,不会显示带有登录按钮的新屏幕,而只会显示用户使用的默认 Facebook 身份验证窗口至?

4

7 回答 7

98

@erdomester,@sromku

Facebook 推出新的 sdk 版本 4.x,其中 Session 已弃用,

来自facebook的登录新概念

LoginManager 和 AccessToken - 这些新类执行 Facebook 登录

所以,现在您可以在没有登录按钮的情况下访问 Facebook 身份验证

布局.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;
    }
}
于 2015-05-14T06:27:36.167 回答
9

像这样的东西

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

            }
        }
    });

其实完全一样。它对我来说非常好。

于 2013-08-08T22:32:29.597 回答
4

这对我有用

    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);
于 2014-08-18T20:39:33.530 回答
2

这个简单的库可以为您提供帮助: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);

希望它可以帮助你。

于 2013-08-09T16:19:37.717 回答
2

无需使用 LoginButton 即可访问 FB 详细信息的 Turnaroubd 是

1)隐藏您的登录按钮 UI

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

于 2016-06-12T06:08:41.843 回答
0

您可以使用 Node 驱动的facebook-proxy模块绕过登录对话框。使用一键部署按钮在 Heroku 上创建您自己的实例。

它的基本作用:

  1. access_token从 Facebook请求
  2. 使用打开代理服务器express-http-proxy
  3. 让我们请求 API 的所有端点
于 2017-11-09T22:18:43.640 回答
0

您可以更改放置 Facebook 按钮并更改可见性。例如 :

<FrameLayout
            android:id="@+id/frameLayout_facebook"
            android:layout_width="0dp"
            android:layout_height="wrap_content">

            <com.google.android.material.button.MaterialButton
                android:id="@+id/button_continue_facebook"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/continue_with_facebook" />

            <com.facebook.login.widget.LoginButton
                android:id="@+id/loginButton_facebook"
                android:visibility="gone"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

 </FrameLayout>

之后,在您的代码中(此处为 Kotlin),当有人单击您的 Button 时,您可以调用 Facebook SDK 的 onClick() 方法:

 button_continue_facebook.setOnClickListener {
            binding.loginButton_facebook.callOnClick()
}
于 2020-12-03T11:25:28.760 回答