安卓 - Facebook SDK 问题

3
我已将Fb登录集成到我的应用程序中。当我点击“登录”按钮(com.facebook.widget.LoginButton)时,它会打开一个额外的活动窗口并显示如下图所示的对话框,然后再登录。为什么会这样?我不想在登录之前打开这个额外的活动窗口。你有任何想法吗?
以下是我的主要活动代码:
public class MainActivity extends SherlockFragmentActivity {

    //Button fblogin;
    Button signup_with_email;
    Button log_in;
    private UiLifecycleHelper uiHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(this, null);
        uiHelper.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initialize();
        setListeners();

    }

    private void initialize() {
        //fblogin = (Button) findViewById(R.id.login_button);
        signup_with_email = (Button) findViewById(R.id.signup_with_email);
        log_in = (Button) findViewById(R.id.log_in);
    }

    private void setListeners() {

        /*fblogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
        });
*/
        signup_with_email.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this,
                        EmailSignUpActivity.class));
            }
        });

        log_in.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, LoginActivity.class));
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        uiHelper.onResume();

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
        startActivity(new Intent(MainActivity.this, DashBoardActivity.class));
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}
2个回答

2

我来晚了,但是被接受的答案是错误的。

通过研究SDK代码,我找到了以下内容:Facebook启动com.facebook.LoginActivity进行登录过程,因为您没有指定自定义主题,它会显示在您的屏幕截图中。这是LoginActivity的JavaDoc:

此Activity是Facebook登录过程的必要部分,但不应直接使用。将此活动添加到AndroidManifest.xml中,以确保正确处理Facebook登录。

他们建议使用Theme.Translucent.NoTitleBar:

<activity android:name="com.facebook.LoginActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:label="@string/app_name" />   

然而,如果您使用建议的主题,则活动将是半透明的,但仍会在中间显示不确定的进度条(即动画加载符号)。

个人而言,我更喜欢使用DialogFragment来指示加载过程,并且根本不显示Facebook的LoginActivity:

<activity
    android:name="com.facebook.LoginActivity" 
    android:theme="@android:style/Theme.NoDisplay" />

1
您正在将null作为UiLifecycleHelper构造函数的第二个参数传递。您需要传递Session.StatusCallback的实例。Facebook SDK教程通常将此显示为Activity中的最终字段,如下所示。
private Session.StatusCallback callback = 
    new Session.StatusCallback() {
    @Override
    public void call(Session session, 
            SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

然后,您需要实现onSessionStateChange函数,在会话打开或关闭时执行您需要的任何操作...在您的情况下,看起来您想在会话状态转为打开时启动DashBoardActivity。
无论如何,在Facebook SDK SSO过程中,由于授权需要暂时将控制权传递给本机Facebook应用程序,因此会出现一个对话框。一旦授权完成,控制权将被传递回来并调用Session.StatusCallback。

我按照你的建议添加了Session.StatusCallback,但是问题依旧存在。当我点击登录按钮时,在打开Facebook应用程序进行授权之前,它会打开另一个带有对话框的活动页面。 - suresh cheemalamudi
但是当我创建另一个只有登录按钮的示例应用程序时,它可以正常工作。这是我的其他代码,它可以正常工作:http://pastebin.com/QjMg7xdS - suresh cheemalamudi
在这种情况下,UiLifeCycleHelper与短暂显示的附加Activity无关,因此它不能解决Suresh的问题。不过,解决方案非常简单,请参阅我的答案以获取详细信息。 - wkarl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接