5

我已經使用各自的方法集成了Google和Facebook註冊。但是簽名成功後,我想打開不同的活動,同樣的用戶可以去各種不同的活動。我在使用操作欄的地方提供了從用戶登錄的任一賬戶登出的選項。當我處於不同的活動時,如何在主要活動中註銷用戶。我收到一個異常,我無法將apiclient引用(對於谷歌)和會話引用(對於臉書)傳遞給另一個活動。請幫忙。 在此先感謝。來自Facebook在Android應用程序中從Google和Facebook註銷

回答

2

註銷:

public static void callFacebookLogout(Context context) { 
Session session = Session.getActiveSession(); 
if (session != null) { 

    if (!session.isClosed()) { 
     session.closeAndClearTokenInformation(); 
     //clear your preferences if saved 
    } 
} else { 

    session = new Session(context); 
    Session.setActiveSession(session); 

    session.closeAndClearTokenInformation(); 
     //clear your preferences if saved 

} 

} 

從谷歌進行註銷:

@Override 
public void onClick(View view) { 
if (view.getId() == R.id.sign_out_button) { 
if (mGoogleApiClient.isConnected()) { 
    Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); 
    mGoogleApiClient.disconnect(); 
    mGoogleApiClient.connect(); 
    } 
} 
} 

guide's docs

0

對於註銷來自Facebook。

public void logoutFromFacebook() { 
     Session session = Session.getActiveSession(); 
     session.closeAndClearTokenInformation(); 
     // Clear Preferences and other data and go back to login activty 
    } 

從Google+註銷。請注意,Google+註銷比Facebook有點棘手。您必須管理布爾值才能在單擊註銷時跟蹤事件(與登錄時相同)。

public void logoutFromGooglePlus() { 
     mGooglePlusLogoutClicked = true; // Keep track when you click logout 
     if (mGoogleApiClient.isConnected()) { 
      Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); 
      revokeAccess(); 
     } else { 
      mGoogleApiClient.connect(); // It can send user to onConnected(), call logout again from there 
     } 
    } 

// revoke access (if needed) 
protected void revokeAccess() { 

     Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient) 
       .setResultCallback(new ResultCallback<Status>() { 
        @Override 
        public void onResult(Status status) { 
         mGoogleApiClient.disconnect(); 
         mGoogleApiClient.connect(); 
         // Clear data and go to login activity 
        } 
       }); 
    } 

要回答在評論的問題: GoogleApiClient可以在應用程序中實例化許多次,它仍然採用相同的情況下,因爲它是初始化的第一次。所以不要擔心如何在活動中「通過」GoogleApiClient。它是一個輕量級客戶端,可以在每個活動中作爲新實例初始化。只要建立一個新的GoogleAPiClient,請致電.connect()並開始工作。但是,您必須實現它所需的接口,但如果您不打算在那裏做任何工作,則可以將方法留空。

至於mLogoutClicked布爾值而言,你可以根據自己的意願擁有自己的實現。基本上,這只是告訴onConnected()方法的一種方式,您需要註銷。 (查看代碼,我們也會在註銷時調用.connect(),因此它可能會進入onConnected()並與您的登錄代碼衝突)。你會做你的onconnected()

public void onConnected(Bundle connectionHint) { 

     if (mGooglePlusLogoutClicked) { 
      logoutFromGooglePlus(); 
      mGooglePlusLogoutClicked = false; 
     } 
    } 

至於具體的實現流量的建議是這樣的,有一個基類做的所有GoogleApiClient初始化,讓登錄活動和其他活動的擴展。所以它會隱含地處理在每個活動中初始化客戶端的問題。只需在基本活動中實現普通的onConnected()onConnectionFailed()等代碼,並讓登錄活動覆蓋這些代碼以實現登錄邏輯。 (和註銷活動相同。它將覆蓋這些和處理註銷代碼)

+0

如何檢索在其他活動googleApiClient對象。另外mGooglePlusLogoutClicked變量應該如何維護?感謝您的Facebook,我能夠完成,但也請幫助我。 – Jarvis

+0

我編輯了包含詳細信息的答案。我儘可能清楚地提到了工作流程(就我所知)。希望能幫助到你。讓我知道。 – VipulKumar

+0

我想要一些關於從Android設備登錄Facebook的幫助。我可以從一臺設備登錄,但是從另一臺設備登錄時,它可以在檢索電子郵件和其他東西時讓我異常。你能幫我解決這個問題嗎?我已添加電子郵件的讀取權限。 – Jarvis

3

只需添加您的新活動如下:

@Override 
     protected void onStart() { 
      mGoogleApiClient.connect(); 
      super.onStart(); 
     } 

,然後從Facebook

@Override 
    public void onClick(View v) { 
      switch (v.getId()) { 
       case R.id.sign_out_button2: 

         Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); 
         mGoogleApiClient.disconnect(); 
         mGoogleApiClient.connect(); 
+0

爲什麼你寫mGoogleApiClient.connect()後跟mGoogleApiClient.disconnect()? –

+0

,因爲它會斷開所有以前的會話 – Andrea

1

退出是很容易

只是添加以下代碼

LoginManager.getInstance().logOut(); 

然後你可以將用戶重定向通過添加以下代碼來登錄活動進一步

LoginManager.getInstance().logOut(); 
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class); 
startActivity(intent); 
finish(); 

所以你的logoutFromFacebook最終代碼會

public void logoutFromFacebook(){ 
    LoginManager.getInstance().logOut(); 
    Intent intent = new Intent(CurrentActivity.this, LoginActivity.class); 
    startActivity(intent); 
    finish(); 
} 

現在只是調用該方法對你的註銷按鈕事件。

10

從谷歌登出:您希望您的註銷按鈕的谷歌+是有

只需添加這對您的新活動,:

@Override 
protected void onStart() { 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail() 
      .build(); 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 
    mGoogleApiClient.connect(); 
    super.onStart(); 
} 

和未來,你可以在按鍵設置setOnClickListener:

signout.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
       new ResultCallback<Status>() { 
        @Override 
        public void onResult(Status status) { 
         // ... 
         Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show(); 
         Intent i=new Intent(getApplicationContext(),MainActivity.class); 
         startActivity(i); 
        } 
       }); 
    } 
}); 
1

首先對於Facebook註銷:

LoginManager.getInstance().logOut(); 

如果您嘗試從其他活動或片段註銷,則會導致您未初始化Facebook sdk等錯誤。然後首先你必須初始化Facebook的SDK如:

FacebookSdk.sdkInitialize(your context here); 

然後從管理器註銷。

繼發谷歌退出:

首先你要檢查谷歌客戶端連接與否,如果連接然後調用註銷代碼:

if (mGoogleApiClient.isConnected()) 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient); 

這裏mGoogleApiClient是GoogleApiClient的對象。

+0

感謝它幫助我 –

1

對於谷歌帳戶

Auth.GoogleSignInApi.signOut(mGoogleApiClient); 

和Facebook帳戶

LoginManager.getInstance().logOut(); 
相關問題