安卓Facebook SDK 3.0会话状态“Opening”

4
我正在根据Facebook的文档集成登录功能。当我点击Facebook登录小部件时,会话变为“正在打开”,应用程序崩溃。
我的Facebook按钮布局:
 <com.facebook.widget.LoginButton
    android:id="@+id/authButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true" 
    />

碎片是指:
public class FacebookFragment extends Fragment {
private static final String TAG = "FacebookFragment";
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(final Session session, final SessionState state, final Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

@Override
public View onCreateView(LayoutInflater inflater, 
        ViewGroup container, 
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);
    LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
    authButton.setFragment(this);
    authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
    return view;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);
}

@Override
public void onResume() {
    super.onResume();
    Session session = Session.getActiveSession();
    if (session != null &&
            (session.isOpened() || session.isClosed()) ) {
        onSessionStateChange(session, session.getState(), null);
    }

    uiHelper.onResume();
}

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

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

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

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

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
    else
        Log.i(TAG, session.toString());
}

在活动中,我已经实现了所需的onActivityResult并检索了片段。

而且,在活动中,我已经实现了所需的onActivityResult并检索了片段。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState == null) {
            // Add the fragment on initial activity setup
            mainFragment = new FacebookFragment();
            getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, mainFragment)
            .commit();
        } else {
            // Or set the fragment from restored state info
            mainFragment = (FacebookFragment) getSupportFragmentManager()
            .findFragmentById(android.R.id.content);
        }   
}


    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}

我认为问题可能在于密钥散列,但我完全按照此问题上发布的答案《Android-Facebook应用程序的密钥散列》的说明进行操作。

如果有任何关于如何将状态更改为“已打开”的线索,将不胜感激。

2个回答

4
问题是在执行Facebook登录的活动中设置了android:clearTaskOnLaunch =“true”。 OnActivityResult无法被调用。在调试模式下运行应用程序时,我能够获得异常。

10
我发现是AndroidManifest中的android:noHistory="true"导致了这个问题。 - caw

0
在你的onResume()中添加session.addCallback(callback):
super.onResume();
Session session = Session.getActiveSession();
session.addCallback(callback);

谢谢,我到电脑前会试一下。 - Darussian
我还没有尝试过,但回调的目的是什么? - Darussian
1
回调是一个带有一个抽象方法(call)的接口,每当会话状态发生变化(打开、关闭、正在打开等)时都会调用该方法。您已经在代码中实现了Session.Callback(回调)。您需要使用它来检查会话何时最终更改为打开状态。 - Mohamed_AbdAllah
我添加了回调函数,但应用程序仍然关闭。 - Darussian
确保在会话打开并且您拥有正确的权限之前,不要对会话进行任何操作(查询帖子、评论、分享等)。 - Mohamed_AbdAllah
实际上,您不需要添加该代码,因为UILifecycleHelper onResume方法已经完成了此操作。 - 5agado

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