2014-03-02 20 views
2

有兩個問題,我的facebook會話處理,爲什麼Facebook登錄會話返回authoirization異常?

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(); 
    } 

} 

回答

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

+0

有沒有什麼辦法來定製按鈕? – user782104

+0

你能告訴我你打算做什麼嗎?爲什麼你需要對它進行優化? –