2

很长一段时间,我使用的登录与this tutorial中的登录几乎完全相同,直到我意识到它已被弃用。使用共享首选项/会话登录Facebook-Android-SDK 3.0

所以就像一个优秀的开发人员,我决定尝试将我的登录升级到Facebook Android 3.0 SDK,但是当我查看文档时,我忍不住想知道为什么当旧的工作如此顺利时,Facebook会使其登录复杂化。

我目前的代码如下,但我有点困惑。我曾经只是向Facebook发出一个授权请求,从他们那里获取一些信息,将它与我的数据库进行比较,如果它匹配了id,则将一些信息保存到共享偏好设置并打开我的应用程序的主页活动。但是,3.0和“会话”我有点困惑:

  1. 我是否必须在所有的活动中使用这些“会话”?
  2. 如果是这样,他们坚持贯穿我的应用程序?
  3. 如果我们已经有共享的首选项,会话的要点是什么?

代码:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.facebook.LoggingBehavior; 
import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.Settings; 
import com.facebook.model.GraphUser; 
import com.loopj.android.http.JsonHttpResponseHandler; 
import com.loopj.android.http.RequestParams; 

public class FBLoginActivity extends Activity { 
    private static final String URL_PREFIX_FRIENDS = "https://graph.facebook.com/me/friends?access_token="; 

    private TextView textInstructionsOrLink; 
    private Button buttonLoginLogout; 
    private Session.StatusCallback statusCallback = new SessionStatusCallback(); 
// List of additional write permissions being requested 
    private static final List<String> PERMISSIONS = Arrays.asList("email","user_about_me","user_activities", 
    "user_birthday","user_education_history", "user_events","user_hometown", "user_groups","user_interests","user_likes", 
    "user_location","user_photos","user_work_history"); 

    SharedPrefs sharedprefs; 
    // Request code for reauthorization requests. 
    private static final int REAUTH_ACTIVITY_CODE = 100; 

    // Flag to represent if we are waiting for extended permissions 
    private boolean pendingAnnounce = false; 
    protected String college; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.facebooklogin); 
     buttonLoginLogout = (Button)findViewById(R.id.buttonLoginLogout); 
     textInstructionsOrLink = (TextView)findViewById(R.id.instructionsOrLink); 

     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

     Session session = Session.getActiveSession(); 
     if (session == null) { 
      if (savedInstanceState != null) { 
       session = Session.restoreSession(this, null, statusCallback, savedInstanceState); 
      } 
      if (session == null) { 
       session = new Session(this); 
      } 
      Session.setActiveSession(session); 
      if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
       session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(PERMISSIONS)); 
      } 
     } 

     updateView(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Session.getActiveSession().addCallback(statusCallback); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     Session.getActiveSession().removeCallback(statusCallback); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
    } 

    private void updateView() { 
     Session session = Session.getActiveSession(); 
     if (session.isOpened()) { 
      Log.i("permissions",session.getPermissions().toString()); 
      //makeLikesRequest(session); 
      makeMeRequest(session); 

      Log.i("token",session.getAccessToken()); 
      Log.i("token experation", session.getExpirationDate().toString()); 




      Intent i = new Intent(getApplicationContext(), FaceTestActivity.class); 
      startActivity(i); 
      /*buttonLoginLogout.setText(R.string.logout); 
      buttonLoginLogout.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { onClickLogout(); } 
      });*/ 
     } else { 
      textInstructionsOrLink.setText(R.string.instructions); 
      buttonLoginLogout.setText(R.string.login); 
      buttonLoginLogout.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { onClickLogin(); } 
      }); 
     } 
    } 

    private void onClickLogin() { 
     Session session = Session.getActiveSession(); 
     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(PERMISSIONS)); 
     } else { 

      Session.openActiveSession(this, true, statusCallback); 
     } 

    } 

    private void onClickLogout() { 
     Session session = Session.getActiveSession(); 
     if (!session.isClosed()) { 
      session.closeAndClearTokenInformation(); 
     } 
    } 

    private class SessionStatusCallback implements Session.StatusCallback { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      updateView(); 
     } 
    } 

    /* private void makeLikesRequest(final Session session) { 
     Request.Callback callback = new Request.Callback() { 

      @Override 
      public void onCompleted(Response response) { 
       // response should have the likes 

       // If the response is successful 
       if (session == Session.getActiveSession()) { 

        Log.i("likes response", response.toString()); 
       } 

      } 
     }; 
     Request request = new Request(session, "me/likes", null, HttpMethod.GET, callback); 
     RequestAsyncTask task = new RequestAsyncTask(request); 
     task.execute(); 
    } */ 


    private void makeMeRequest(final Session session) { 
     // Make an API call to get user data and define a 
     // new callback to handle the response. 
     Request request = Request.newMeRequest(session, 
       new Request.GraphUserCallback() { 
      @Override 
      public void onCompleted(GraphUser user, Response response) { 
       // If the response is successful 
       if (session == Session.getActiveSession()) { 
        if (user != null) { 
         // Set the id for the ProfilePictureView 
         // view that in turn displays the profile picture. 
         Log.i("user", user.toString()); 
         JSONObject json = user.getInnerJSONObject(); 
         Log.i("json me response", json.toString()); 

         RequestParams params = new RequestParams(); 

         String fb_token = session.getAccessToken().toString(); 
         String fb_token_expires = session.getExpirationDate().toString(); 
         Log.i("fb_token", fb_token); 
         params.put("fb_token",fb_token); 
         Log.i("fb_token_expires", fb_token_expires); 
         params.put("fb_token_expires",fb_token); 



         if(user.getBirthday() != null){ 
          String birthday = user.getBirthday(); 
          Log.i("birthday_1",birthday); 
          params.put("birthday", birthday); 
         } 

         if(user.getFirstName() != null){ 
          String firstName = user.getFirstName(); 
          Log.i("first name_2", firstName); 
          params.put("firstName", firstName); 
         } 

         if(user.getLastName() != null){ 
          String lastName = user.getLastName(); 
          Log.i("last name_3", lastName); 
          params.put("lastName", lastName); 
         } 

         if(user.getLink() != null){ 
          String fb_link = user.getLink(); 
          Log.i("fb_link_4", fb_link); 
          params.put("fb_link", fb_link); 
         } 

         if(user.getId() != null){ 
          String fb_uid = user.getId(); 
          Log.i("fb uid_5", fb_uid); 
          params.put("fb_uid", fb_uid); 
         } 


         if(user.getProperty("gender") != null){ 
          String gender = user.getProperty("gender").toString(); 
          Log.i("gender_6", gender); 
          params.put("gender", gender); 
         } 

         if(user.getProperty("email") != null){ 
          String email = user.getProperty("email").toString(); 
          Log.i("email_7", email); 
          params.put("email", email); 
         } 


         if(user.getProperty("verified") != null){ 
          String verified = user.getProperty("verified").toString(); 
          Log.i("verified_8", verified); 
          params.put("verified", verified); 

         } 


         if(user.getProperty("bio") != null){ 
          String bio = user.getProperty("bio").toString(); 
          Log.i("bio_9", bio); 
          params.put("bio", bio); 

         } 
         if(user.getLocation().getProperty("name") != null){ 

          String location = user.getLocation().getProperty("name").toString(); 
          Log.i("location_10", location); 
          params.put("location", location); 

         } 


         //user Location 
         JSONArray education_array = (JSONArray)user.getProperty("education"); 
         if (education_array.length() > 0) { 
          String education_length= String.valueOf(education_array.length()); 
          Log.i("education_length",education_length); 
          ArrayList<String> collegeNames = new ArrayList<String>(); 
          for (int i=0; i < education_array.length(); i++) { 
           JSONObject edu_obj = education_array.optJSONObject(i); 


           // Add the language name to a list. Use JSON 
           // methods to get access to the name field. 

           String type = edu_obj.optString("type"); 
           Log.i("type of edu", type); 
           if(type.equalsIgnoreCase("college")){ 
            JSONObject school_obj = edu_obj.optJSONObject("school"); 
            college = school_obj.optString("name"); 
            //Log.i("college",college); 



           } 


          } 
          params.put("college", college); 
          Log.i("college", college); 

         } 


         RestClient.post(FB_LOGIN_URL, params, new JsonHttpResponseHandler() { 
          @Override 
          public void onFailure(Throwable arg0, JSONObject arg1) { 
           // TODO Auto-generated method stub 
           super.onFailure(arg0, arg1); 

           Log.i("FAILED TO LOGIN:", arg1.toString()); 
           Toast.makeText(getApplicationContext(), arg1.toString() , Toast.LENGTH_LONG).show(); 
          } 

          @Override 
          public void onSuccess(JSONObject json) { 

           Log.i("Login Request Success:", json.toString()); 

           try { 

            sharedprefs.createLoginSession(json); 
            HashMap<String, String> user = sharedprefs.getUserDetails(); 
            String profile_uid = user.get(sharedprefs.KEY_UID); 
            Intent i = new Intent(getApplicationContext(), TabHostFragmentActivity.class); 
            i.putExtra("profile_uid", profile_uid); 
            startActivity(i); 
            finish(); 


           } catch (JSONException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 

          } 
         }); 










        } 
       } 
       if (response.getError() != null) { 
        // Handle errors, will do so later. 
       } 
      } 
     }); 
     request.executeAsync(); 
    } 
} 

回答

1

你必须总是指独特会议类。 每个活动都必须从会话类中取得已打开的会话,或者如果找不到有效会话,则会创建一个新会话。

正如官方网站所说,你必须在每一个想要向Facebook发出请求的活动中管理会话生命周期。
UiLifecycleHelper是一个非常有用的类,它可以帮助您管理活动生命周期中的会话状态(例如,此类的onPause()方法处理删除在其调用的活动中添加的回调)

定义Session类是为了更好地控制活动中用户的身份验证,并保证令牌缓存的自动管理。 Here你可以找到更多的细节。