Android Facebook 登录:如何在 XML 中没有 LoginButton 的情况下使用 LoginManager 检查登录

Android Facebook Login : How to check login using LoginManager without having LoginButton in XML

我已经使用 LoginButton 在我的 android 应用程序中完成了 facebook 登录检查,但我想使用 LoginManager 进行检查。我怎样才能修改我的代码以那样工作?

   LoginButton loginButton = (LoginButton) findViewById(R.id.fb_login_button);
    loginButton.setReadPermissions("user_friends");

    shareDialog = new ShareDialog(this);

    //Login Callback registration
    LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Toast.makeText(getApplicationContext(), "in LoginResult on success", Toast.LENGTH_LONG).show();

            //Login success - process to Post
            if (ShareDialog.canShow(ShareLinkContent.class)) {
                String description = "description";
                ShareLinkContent linkContent = new ShareLinkContent.Builder()
                        .setContentTitle("title")
                        .setContentDescription(description)
                        .setContentUrl(Uri.parse("http://google.com"))
                        .setImageUrl(Uri.parse("http://google.com"))
                        .build();

                shareDialog.show(linkContent, ShareDialog.Mode.FEED);
            }

        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(), "in LoginResult on cancel", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(FacebookException exception) {
            Toast.makeText(getApplicationContext(), "in LoginResult on error", Toast.LENGTH_LONG).show();
        }
    });

如果用户在通过共享对话框打开之前未登录,我还想打开 Facebook 登录对话框。登录对话框应与共享对话框(在弹出窗口中)相同。怎么做?

谢谢!

您可以获得该用户配置文件,试试这个,

    Profile dd = Profile.getCurrentProfile().getCurrentProfile();
    if(dd != null)
    {
        //user has logged
    }
    else
    {
        //not logged
    }

您可以在没有 LoginButton 的情况下重新启动登录,如下所示,

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList(<required permissions>));

还需要为上述请求实现回调

您可以检查用户是否登录,通过调用方法Loginmanger.logInWithReadPermissions,手动启动登录过程,无需按钮。您可以在 onCreate 方法中执行此操作。如果用户登录,它会立即调用 onSuccess 回调方法,您可以在其中调用您的 shareDialog。如果用户未登录,它将显示登录屏幕。如果成功(即用户登录),将调用 onSuccess 方法;

实际上,您可以从代码中删除所有 login button 项,并在末尾添加一行:

LoginManager.getInstance().logInWithReadPermissions(this, "user_friends"); //Log in to FB

您也可以使用 WritePermissions。您可以阅读有关所需权限的信息 here.

这是您的代码,但包装为登录方法,没有任何登录按钮实例。您可以在任何地方调用它,当您需要检查用户是否已登录时。

public void checkLogin() {
    //Login Callback registration
    LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Toast.makeText(getApplicationContext(), "in LoginResult on success", Toast.LENGTH_LONG).show();

            //Login success - process to Post
            if (ShareDialog.canShow(ShareLinkContent.class)) {
                String description = "description";
                ShareLinkContent linkContent = new ShareLinkContent.Builder()
                        .setContentTitle("title")
                        .setContentDescription(description)
                        .setContentUrl(Uri.parse("http://google.com"))
                        .setImageUrl(Uri.parse("http://google.com"))
                        .build();

                shareDialog.show(linkContent, ShareDialog.Mode.FEED);
            }

        }

        @Override
        public void onCancel() {
            Toast.makeText(getApplicationContext(), "in LoginResult on cancel", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(FacebookException exception) {
            Toast.makeText(getApplicationContext(), "in LoginResult on error", Toast.LENGTH_LONG).show();
        }
    });

    LoginManager.getInstance().logInWithReadPermissions(this, "user_friends"); //Log in to FB
}

您可以以类似的方式使用 ProfileTracker 来跟踪当前配置文件中的更改:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FacebookSdk.sdkInitialize(this.getApplicationContext());
    callbackManager = CallbackManager.Factory.create();

    profileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(
                Profile oldProfile,
                Profile currentProfile) {
            // here if session exist
        }
    };
}

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

@Override
public void onDestroy() {
    super.onDestroy();
    profileTracker.stopTracking();
}

来自这里的来源:https://developers.facebook.com/docs/facebook-login/android/v2.3#get_current