当我运行时:
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()按钮处理程序中。
我将所有这些放在片段中,而不是活动。
我错过了什么吗?
答案 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());
这将解决您的问题。