我可以登录我的应用程序然后分享一些东西。这需要一个OPENED会话状态。但是,当我没有登录时,我想分享一些东西,我需要打开会话。我正在使用ViewPager,例如当我从一个页面转到另一个页面时此代码
Session.openActiveSession(getActivity(), true, new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
}
});
在代码的开头,然后会话变为活动状态,我自动登录,这是错误的!这就是为什么我把这个代码块放到onClickListener中,所以我只想在我点击应用程序中的分享按钮时打开会话:
if (session != null && session.isOpened()) {
publishFeedDialog();
}
else {
Session.openActiveSession(getActivity(), true, new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
}
});
publishFeedDialog();
}
private void publishFeedDialog() {
session = Session.getActiveSession();
Log.i("TAG", session.getState() + ""); //OPENING
WebDialog feedDialog = (
new WebDialog.FeedDialogBuilder(getActivity(),
Session.getActiveSession(),
params))
.setOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(Bundle values,
FacebookException error) {
if (error == null) {
final String postId = values.getString("post_id");
if (postId != null) {
} else {
// User clicked the Cancel button
}
} else if (error instanceof FacebookOperationCanceledException) {
} else {
// Generic, ex: network error
}
}
})
.build();
feedDialog.show();
}
错误:
尝试使用未打开的会话。
所以我徒劳地打开会话,因为当WebDialog应该出现时它仍然处于打开状态。
请帮忙。
答案 0 :(得分:5)
对我而言,它的工作原理如下:
if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()) {
publishFeedDialog();
}
else {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
// List<String> permissions = new ArrayList<String>();
// permissions.add("email");
session.openForRead(new Session.OpenRequest(this)
// .setPermissions(permissions)
.setCallback(mFacebookCallback));
} else {
Session.openActiveSession(getActivity(), true, mFacebookCallback);
}
}`
回调是
private Session.StatusCallback mFacebookCallback = new Session.StatusCallback() {
@Override
public void
call(final Session session, final SessionState state, final Exception exception) {
if (state.isOpened()) {
String facebookToken = session.getAccessToken();
Log.i("MainActivityFaceBook", facebookToken);
Request.newMeRequest(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
com.facebook.Response response) {
publishFeedDialog();
}
}).executeAsync();
Prefs.setStringProperty(getActivity(), R.string.key_prefs_facebook_token, facebookToken);
}
}
};
尝试在CallBack onCompleted
中调用publishFeedDialog()答案 1 :(得分:2)
在检查会话状态后尝试从call()内部调用publishFeedDialog()(不要使用session.isOpened(),而是使用state.isOpened())。检查状态可确保您的会话处于打开状态,并且还可用于执行请求。可以多次调用StatusCallback,直到Session实际打开为止,这就是为什么你应该在发送任何请求之前检查状态。
答案 2 :(得分:0)
如果要从片段打开会话,请使用下一个openActiveSession方法实现。
openActiveSession(Context context, Fragment fragment, boolean allowLoginUI, Session.StatusCallback callback)
这适合我。