我的facebook会话处理有两个问题,
1)如果用户点击接受权限,则返回Facebook访问令牌无效,并显示消息“会话与当前存储的会话不匹配”
2)如果在对话框显示期间按下主页按钮,我无法按下登录按钮,但是当我按下后退按钮时显示
实施流程是否正确? (我应该在失败后删除会话吗?)
感谢您的帮助
public class Home extends Fragment implements LoginListener {
private final static String TAG = "Home";
public View rootView;
public ImageView HomeBg;
public ImageView buttonLoginLogout;
public TextView chi;
public TextView eng;
public ColorStateList oldColor;
public SharedPreferences prefs;
public EasyTracker tracker = null;
public SharedPreferences.Editor editor;
public ArrayList<String> permission;
public ProgressDialog pd;
public Home ctx;
//Facebook login
private Session.StatusCallback statusCallback = new SessionStatusCallback();
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
ctx = this;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
tracker = EasyTracker.getInstance(getActivity());
permission = new ArrayList<String>();
permission.add("email");
prefs = getActivity().getSharedPreferences("userInfo", 0);
editor = prefs.edit();
rootView = inflater.inflate(R.layout.home, container, false);
buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB);
//Facebook login
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState);
}
if (session == null) {
session = new Session(getActivity());
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setPermissions(permission).setCallback(statusCallback));
}
}
updateView();
return rootView;
}
@Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
tracker.set(Fields.SCREEN_NAME, "hk7app/CX/" + Utility.getLocale(getActivity()) + "/Landing Page");
tracker.send(MapBuilder.createAppView().build());
}
@Override
public void onStop() {
super.onStop();
if (pd != null)
pd.dismiss();
Session.getActiveSession().removeCallback(statusCallback);
EasyTracker.getInstance(getActivity()).activityStop(getActivity());
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
@SuppressWarnings("deprecation")
private void updateView() {
Log.d(TAG,"updateView");
final Session session = Session.getActiveSession();
if (session.isOpened()) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,Response response) {
// TODO Auto-generated method stub
if (user != null) {
if (!user.getId().equals(prefs.getString("fbId",""))) {
editor.putString("fbId", user.getId());
editor.putString("fName", user.getFirstName());
editor.putString("lName", user.getLastName());
editor.putString("email", user.asMap().get("email").toString());
editor.commit();
}
if (prefs.getString("memId","").equals("") || prefs.getString("token","").equals("") || !user.getId().equals(prefs.getString("fbId",""))){
pd = ProgressDialog.show(getActivity(), getActivity().getResources().getString(R.string.sys_info),getActivity().getResources().getString(R.string.loading));
new APIHandler(getActivity(),tracker,"login").execute(ctx,session.getAccessToken()); // my backend
} else {
onLoginComplete("","");
}
}
}
});
} else {
buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { onClickLogin(); }
});
}
}
private void onClickLogin() {
tracker.send(MapBuilder.createEvent("menu_click","Fbconnect","connectFB_" + Utility.getLocale(getActivity()),null).build());
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setPermissions(permission).setCallback(statusCallback));
} else {
Session.openActiveSession(getActivity(), this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
Log.d(TAG,"SessionStatusCallback");
Log.d(TAG,""+exception);
if (exception instanceof FacebookAuthorizationException){
new AlertDialog.Builder(getActivity())
.setTitle(ctx.getResources().getString(R.string.sys_info))
.setMessage(R.string.facebook_permission_missing)
.setPositiveButton(ctx.getResources().getString(R.string.close), null)
.show();
} else if (exception == null) {
updateView();
}
}
}
@Override
public void onResume() {
super.onResume();
AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id));
}
@Override
public void onLoginComplete(String memberId, String token) {
if (pd != null)
pd.dismiss();
if (!memberId.equals("") && !token.equals("")) {
editor.putString("memId", memberId);
editor.putString("token", token);
editor.commit();
}
buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
tracker.send(MapBuilder.createEvent("menu_click","TakeSelfie","Selfie_now_" + Utility.getLocale(getActivity()),null).build());
((LandingPage)getActivity()).tabHost.setCurrentTab(2);
}
});
}
@Override
public void onLoginFailure(String errorMsg) {
if (pd != null)
pd.dismiss();
Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:2)
尝试使用内置的Facebook
SDK登录按钮,您可以轻松登录并获取accessToken
在您的布局中包含此XML
<com.facebook.widget.LoginButton
android:id="@+id/authButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
/>
并按照link
进行操作