首页 文章

Facebook身份验证没有登录按钮

提问于
浏览
48

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

  • 应用程序打开,显示一个显示登录按钮的片段

  • 用户单击登录,通过引用的FacebookSDK库(com.facebook.widget.LoginActivity)和使用会话提供的代码完成身份验证 .

  • 用户被重定向到下一个屏幕

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

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

6 回答

  • 85

    @erdomester,@ sromku

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

    有来自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;
        }
    }
    
  • 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");
    
                }
            }
        });
    

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

  • 2

    这对我有用

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

    这个简单的库可以帮到你:https://github.com/sromku/android-simple-facebook

    只需将此库添加到您的项目中,并将此库中的引用引用到Facebook SDK 3.0.x,并将您的应用程序的引用添加到此库中 .

    然后你可以在没有 LoginButton 的情况下登录并执行简单的操作,例如发布供稿,获取 Profiles /朋友,发送邀请等等 .

    这是登录的样子:

    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() 回调方法中,您可以发布这样的Feed:

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

    希望它可以帮到你 .

  • 3

    使用LoginButton访问FB详细信息的Turnaroubd是

    1)隐藏您的LoginButton 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

  • 0

    您可以使用节点供电的facebook-proxy模块绕过登录对话框 . 使用一键部署按钮在Heroku上创建自己的实例 .

    它基本上做了什么:

    • 从Facebook请求 access_token

    • 使用 express-http-proxy 打开代理服务器

    • 让我们请求API的所有 endpoints

相关问题