0

我正在爲更大的項目實施Facebook登錄。作爲組織代碼的嘗試(並且我的意思是儘可能保持活動與按鈕儘可能乾淨),我想我可能已經打破了一些主要黑客的實際登錄過程。但我知道它應該工作。這個想法是在登錄後啓動另一項活動。 這裏是我的MainActivity:試圖在Android上使用Facebook登錄sdk並組織代碼

public class MainActivity extends ActionBarActivity implements OnClickListener { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     setContentView(R.layout.activity_main); 

     Button facebookLoginButton = (Button) findViewById(R.id.btn_facebook_login); 
     facebookLoginButton.setOnClickListener(this); 
    } 


    @Override 
    public void onClick(View view) { 

     switch (view.getId()) { 
      case R.id.btn_facebook_login: 

       FacebookHelper.sMainActivityContext = getApplicationContext(); 
       LoginManager.getInstance().registerCallback(FacebookHelper.sCallbackManager, 
         FacebookHelper.sFacebookCallback); 

       LoginManager.getInstance().logInWithReadPermissions(this, 
         Arrays.asList(AppResources.sFacebookPermissions)); 

      break; 
     } 

    } 
} 

與侵入本身,「FacebookHelper」:

public class FacebookHelper { 

    public static final CallbackManager sCallbackManager = CallbackManager.Factory.create(); 

    public static Context sMainActivityContext; 

    public static final FacebookCallback<LoginResult> sFacebookCallback = 
      new FacebookCallback<LoginResult>() { 

       @Override 
       public void onSuccess(LoginResult loginResult) { 
        Intent intent = new Intent(sMainActivityContext, SecondActivity.class); 
        sMainActivityContext.startActivity(intent); 
       } 

       @Override 
       public void onCancel() { 

       } 

       @Override 
       public void onError(FacebookException e) { 

       } 
      }; 

} 

但是當我按下按鈕,用於登錄只是閃爍的Facebook活動,我回來了,在主要活動。爲什麼會發生?我需要做什麼來實現工作Facebook登錄與分離的代碼和而不是使用LoginButton從Facebook?

回答

2

1)您應該在onCreate中註冊回調,否則當您的活動由於方向或大小更改而被回收時,您的回叫將不會被添加回新活動中。 2)您必須將結果傳回onActivityResult中的callbackManager。 3)如果你對主要活動保持一個靜態引用,如果主要活動被回收,你可能會有一箇舊的實例。你也應該在onCreate中新建一個回調管理器,並將其作爲活動的類變量。

事情是這樣的:

public class MainActivity extends ActionBarActivity implements OnClickListener { 

    private CallbackManager callbackManager; 


    private final FacebookCallback<LoginResult> facebookCallback = 
      new FacebookCallback<LoginResult>() { 

       @Override 
       public void onSuccess(LoginResult loginResult) { 
        Intent intent = new Intent(this, SecondActivity.class); 
        startActivity(intent); 
       } 

       @Override 
       public void onCancel() { 

       } 

       @Override 
       public void onError(FacebookException e) { 

       } 
      }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); 
     callbackManager = CallbackManager.Factory.create(); 
     setContentView(R.layout.activity_main); 

     Button facebookLoginButton = (Button) findViewById(R.id.btn_facebook_login); 
     facebookLoginButton.setOnClickListener(this); 
     loginManager.getInstance().registerCallback(callbackManager, 
         facebookCallback); 
    } 


    @Override 
    public void onClick(View view) { 

     switch (view.getId()) { 
      case R.id.btn_facebook_login: 
       LoginManager.getInstance().logInWithReadPermissions(this, 
         Arrays.asList(AppResources.sFacebookPermissions)); 

      break; 
     } 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     callbackManager.onActivityResult(requestCode, resultCode, data); 
    } 

} 
+0

偉大的答案,就像一個魅力,謝謝!這太糟糕了,我實際上無法分離代碼,但我仍然比LoginButton更喜歡這種方式。 – Deegriz 2015-04-04 18:54:36