com.facebook.Session对象上的空指针异常

时间:2015-03-05 20:18:06

标签: android facebook

当我运行时:

Session session = Session.getActiveSession();

if (!session.isOpened() && !session.isClosed())
{
    session.openForRead(new Session.OpenRequest(this)
        .setPermissions(Arrays.asList("public_profile"))
        .setCallback(statusCallback));
}
else 
{
    Session.openActiveSession(getActivity(), this, true, statusCallback);
}

导致NullPointer异常:

  

java.lang.NullPointerException:尝试调用虚方法' boolean com.facebook.Session.isOpened()'在空对象引用上


我的代码在onClick()按钮处理程序中。

我将所有这些放在片段中,而不是活动

我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

根据document

getActiveSession() 返回当前活动的Session,如果没有,则返回null。

所以只需修改你的if语句来处理这种情况:

Session session = Session.getActiveSession();
if (session != null && (!session.isOpened() && !session.isClosed()))
{
    session.openForRead(new Session.OpenRequest(this)
    .setPermissions(Arrays.asList("public_profile"))
    .setCallback(statusCallback));
}
else 
{
    Session.openActiveSession(getActivity(), this, true, statusCallback);
}

答案 1 :(得分:0)

获取会话后如果为null,则使用以下代码从缓存中恢复会话:

Session session = Session.getActiveSession();

if(session==null){ 
// try to restore from cache 
session = Session.openActiveSessionFromCache(getActivity());
}

答案 2 :(得分:0)

如果您没有初始化会话,那么您可能需要转到facebook插件上的ConnectPlugin.java,并在initialize方法中更改以下代码。

    Session session = new Session.Builder(cordova.getActivity()).setApplicationId(applicationId).build();
        if (session.getState() == SessionState.CREATED_TOKEN_LOADED) {
        Session.setActiveSession(session);
// Create the request
        Session.OpenRequest openRequest = new Session.OpenRequest(cordova.getActivity()); 

由下面的一个:

// Open a session if we have one cached Session session = new Session.Builder(cordova.getActivity()).setApplicationId(applicationId).build();
Session.setActiveSession(session);
if (session.getState() == SessionState.CREATED_TOKEN_LOADED) {
// Create the request Session.
OpenRequest openRequest = new Session.OpenRequest(cordova.getActivity());

这将解决您的问题。