Facebook身份验证没有登录按钮

erd*_*ter 48 android facebook facebook-android-sdk

我已经学习了一些Facebook API 3.0教程,包括Login/Logout和Publish To Feed示例.所以登录以这种方式工作:

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

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

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

Tej*_*oid 91

@erdomester,@ sromku

Facebook推出新的sdk版本4.x,其中会话被弃用,

有来自facebook的新登录概念

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

所以,现在您可以访问Facebook身份验证而无需登录按钮

layout.xml

    <Button
            android:id="@+id/btn_fb_login"
            .../>
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

编辑

如果你不添加以下内容,它将无法正常工作(@Daniel Zolnai在下面的评论中正确指出):

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

  • 这对我来说很好.如果没有调用回调,请检查是否添加了以下行:@Override protected void onActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode,resultCode,data); callbackManager.onActivityResult(requestCode,resultCode,data); } (7认同)
  • 注意将`MainActivity.this`设置为`logInWithReadPermissions()`的属性.或者`this`将意味着`View.OnClickListener`而不是`Activity`. (4认同)

WIl*_*JBD 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");

            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

实际上就是这样.它对我来说非常好.