Làm cách nào để đăng xuất theo chương trình khỏi Facebook SDK 3.0 mà không cần sử dụng nút đăng nhập / đăng xuất Facebook?


80

Tiêu đề nói lên tất cả. Tôi đang sử dụng một nút tùy chỉnh để lấy thông tin facebook của người dùng (cho mục đích "đăng ký"). Tuy nhiên, tôi không muốn ứng dụng ghi nhớ người dùng đã đăng ký cuối cùng, cả người hiện đang đăng nhập thông qua ứng dụng gốc Facebook. Tôi muốn hoạt động đăng nhập Facebook bật lên mỗi lần. Đó là lý do tại sao tôi muốn đăng xuất bất kỳ người dùng trước nào theo lập trình.

Làm thế nào tôi có thể làm điều đó? Đây là cách tôi thực hiện đăng nhập:

private void signInWithFacebook() {

    SessionTracker sessionTracker = new SessionTracker(getBaseContext(), new StatusCallback() 
    {
        @Override
        public void call(Session session, SessionState state, Exception exception) { 
        }
    }, null, false);

    String applicationId = Utility.getMetadataApplicationId(getBaseContext());
    mCurrentSession = sessionTracker.getSession();

    if (mCurrentSession == null || mCurrentSession.getState().isClosed()) {
        sessionTracker.setSession(null);
        Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
        mCurrentSession = session;
    }

    if (!mCurrentSession.isOpened()) {
        Session.OpenRequest openRequest = null;
        openRequest = new Session.OpenRequest(RegisterActivity.this);

        if (openRequest != null) {
            openRequest.setPermissions(null);
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  fillProfileWithFacebook( user );
              }
            });
    }
}

Tốt nhất, tôi sẽ thực hiện cuộc gọi ở đầu phương thức này để đăng xuất bất kỳ người dùng nào trước đó.

Câu trả lời:


161

Cập nhật cho SDK mới nhất:

Hiện câu trả lời của @ zeuter là đúng cho Facebook SDK v4.7 +:

LoginManager.getInstance().logOut();

Câu trả lời ban đầu:

Vui lòng không sử dụng SessionTracker. Nó là một lớp nội bộ (gói riêng tư) và không được sử dụng như một phần của API công khai. Do đó, API của nó có thể thay đổi bất kỳ lúc nào mà không có bất kỳ đảm bảo tương thích ngược nào. Bạn sẽ có thể loại bỏ tất cả các phiên bản SessionTracker trong mã của mình và chỉ sử dụng phiên hoạt động thay thế.

Để trả lời câu hỏi của bạn, nếu bạn không muốn giữ bất kỳ dữ liệu phiên nào, chỉ cần gọi closeAndClearTokenInformation khi ứng dụng của bạn đóng.


3
Bạn chỉ cần gọi Session.getActiveSession và nếu nó trả về null, thì bạn có thể 1.) tạo một Session mới bằng cách sử dụng Session.Builder và gọi Session.setActiveSession hoặc 2.) gọi một trong các phương thức Session.openActiveSession (tĩnh cái mà cả hai đều mở và đặt phiên hoạt động cho bạn).
Ming Li

24
Và việc bạn phải mở một phiên để đăng xuất cho thấy thiết kế SDK Facebook tệ đến mức nào… Thay vì cung cấp một API công khai đơn giản với các Gọi lại tiêu chuẩn, bạn phải triển khai một cơ chế… đáng kinh ngạc.
Martin Marconcini

18
SDK và tài liệu của Facebook thật thảm hại!
Skynet

3
Các tài liệu chính thức của Facebook bao gồm mã trong các ví dụ không được dùng nữa - Sau đó, chúng tôi phải tham khảo trình bổ sung ngăn xếp cũ tốt để loại bỏ mã tương tự.
Skynet

1
Thay vì thêm các nhận xét không đóng góp vào cuộc trò chuyện, bạn nên đưa ra các ví dụ cụ thể về nơi thiếu tài liệu (liên quan đến câu hỏi / câu trả lời) hoặc bạn có thể đi đến cuối trang tài liệu cụ thể trên cổng thông tin nhà phát triển và nhấp vào vào nút "Không" cho "Tài liệu này có hữu ích không?".
Ming Li

87

Phương pháp này sẽ giúp bạn đăng xuất khỏi facebook theo lập trình trong android

/**
 * Logout From Facebook 
 */
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

    }

}

3
Đối với tôi, là giải pháp hiệu quả duy nhất, trong trường hợp sử dụng các mảnh thay vì Hoạt động!
Roger Alien

tại sao bạn có phần khác trong mã? Nếu người dùng chưa đăng nhập thì tại sao phải đăng nhập lại rồi đăng xuất?
Vihaan Verma

1
gặp lỗi java.lang.NullPointerException: Đối số 'applicationId' không được rỗng
Krunal Shah

Tôi nghĩ rằng cách thích hợp để khởi tạo phiên là Session.Builder mới (context) .build ();
hasan

Tại sao elsemột phần?
aandis

66

Vì SDK Android v4.0 của Facebook (xem bảng thay đổi ), bạn cần thực thi những điều sau:

LoginManager.getInstance().logOut();

7
Cảm ơn, nhưng tôi không thấy rằng điều này thực sự xóa phiên. LoginManager.logout () chỉ gọi nội bộ "AccessToken.setCurrentAccessToken (null); Profile.setCurrentProfile (null);". Tôi thấy rằng người dùng vẫn có thể đăng nhập mà không cần phải nhập lại thông tin đăng nhập vào lần tiếp theo họ khởi chạy ứng dụng. Làm cách nào để bạn buộc người dùng nhập lại thông tin đăng nhập của họ?
swooby

Phương pháp này đã giúp tôi. Sau khi gọi nó và cố gắng đăng nhập lại, màn hình thông tin đăng nhập xuất hiện, như mong đợi. Cảm ơn rất nhiều.
Zsolt Boldizsár

1
Như @swooby đã chỉ ra, giải pháp này rất tiếc không hoạt động trên các ứng dụng sử dụng facebook sdk v4.x Sau khi thực hiện logOut, AccessToken là [{AccessToken token: ACCESS_TOKEN_REMOVED quyền: [public_profile]}] nhưng AccessToken.getCurrentAccessToken (). GetToken () trả về mã thông báo hợp lệ chuỗi ngay cả khi người dùng không đăng nhập nữa hoặc thu hồi quyền đối với ứng dụng.
Lisitso

@Lisitso Bạn có biết giải pháp cho việc đó bây giờ không?
Jaec

1
@Jaec Tôi đã sử dụng giải pháp do "Aniket Thakur" cung cấp. Bạn có thể tìm thấy ở đây trong số các tương ứng khác. Chúc mừng!
Lisitso

27

Đây là đoạn mã cho phép tôi đăng xuất theo chương trình khỏi facebook. Hãy cho tôi biết nếu bạn thấy bất kỳ điều gì mà tôi có thể cần cải thiện.

private void logout(){
    // clear any user information
    mApp.clearUserPrefs();
    // find the active session which can only be facebook in my app
    Session session = Session.getActiveSession();
    // run the closeAndClearTokenInformation which does the following
    // DOCS : Closes the local in-memory Session object and clears any persistent 
    // cache related to the Session.
    session.closeAndClearTokenInformation();
    // return the user to the login screen
    startActivity(new Intent(getApplicationContext(), LoginActivity.class));
    // make sure the user can not access the page after he/she is logged out
    // clear the activity stack
    finish();
}

jpotter6 mApp là gì?
Amitsharma,

Một phiên bản của lớp Ứng dụng có sẵn trong bất kỳ ứng dụng Android nào
Eenvincible

13

Vì SDK Android v4.0 của Facebook, bạn cần thực thi những điều sau:

LoginManager.getInstance().logOut();

Điều này là không đủ. Điều này chỉ đơn giản là xóa mã thông báo truy cập được lưu trong bộ nhớ cache và hồ sơ để AccessToken.getCurrentAccessToken()Profile.getCurrentProfile()bây giờ sẽ trở thành trống.

Để đăng xuất hoàn toàn, bạn cần thu hồi quyền và sau đó gọi LoginManager.getInstance().logOut();. Để thu hồi quyền, hãy thực thi API đồ thị sau:

    GraphRequest delPermRequest = new GraphRequest(AccessToken.getCurrentAccessToken(), "/{user-id}/permissions/", null, HttpMethod.DELETE, new GraphRequest.Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {
            if(graphResponse!=null){
                FacebookRequestError error =graphResponse.getError();
                if(error!=null){
                    Log.e(TAG, error.toString());
                }else {
                    finish();
                }
            }
        }
    });
    Log.d(TAG,"Executing revoke permissions with graph path" + delPermRequest.getGraphPath());
    delPermRequest.executeAsync();

2
Đây là câu trả lời chính xác cho câu hỏi này. LoginManager.getInstance().logOut();chỉ xóa bộ nhớ cache cục bộ, trong khi GraphRequestcuộc gọi lập trình thu hồi quyền truy cập ứng dụng từ tài khoản Facebook của người dùng. Cả hai đều cần thiết. Một mình cũng không đủ.
YS

Chúng tôi phải đặt mã này ở đâu để có quyền xóa ?! Mã không hoạt động trong trường hợp của tôi! Bạn có thể cung cấp đoạn mã đầy đủ không ạ.!?
Akshay Shinde

Mã đang hoạt động nhưng đưa ra cảnh báo: Yêu cầu không có mã thông báo truy cập thiếu ID ứng dụng hoặc mã thông báo khách. Tôi có cần thêm thứ gì đó vào "/ {user-id} / permissions /" trong đoạn mã trên không?
zeeshan

@zeeshan thay thế {user-id} bằng tôi
Amritpal singh

8

Lớp phiên đã bị xóa trên SDK 4.0. Việc quản lý đăng nhập được thực hiện thông qua LoginManager của lớp . Vì thế:

mLoginManager = LoginManager.getInstance();
mLoginManager.logOut();

Như tài liệu tham khảo Nâng cấp lên SDK 4.0 cho biết:

Phiên đã bị xóa - các lớp AccessToken, LoginManager và CallbackManager bắt buộc và thay thế chức năng trong lớp Session.


1
Câu trả lời của zeuter ngắn hơn và chỉ ra cùng một cuộc gọi api. Tại sao lại trùng lặp?
rekire

3

Đúng vậy, Như @luizfelippe đã đề cập Lớp Phiên đã bị xóa kể từ SDK 4.0. Chúng ta cần sử dụng LoginManager.

Tôi vừa xem xét lớp LoginButton để đăng xuất. Họ đang thực hiện loại kiểm tra này. Họ chỉ đăng xuất nếu accessToken không rỗng. Vì vậy, tôi nghĩ sẽ tốt hơn nếu có điều này trong mã của chúng tôi ..

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}

Câu trả lời của zeuter ngắn hơn và chỉ ra cùng một cuộc gọi api. Tại sao lại trùng lặp?
rekire

0
private Session.StatusCallback statusCallback = new SessionStatusCallback();

logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Session.openActiveSession(this, true, statusCallback);  
}
});

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

0

Facebook cung cấp hai cách để đăng nhập và đăng xuất khỏi tài khoản. Một là sử dụng LoginButton và hai là sử dụng LoginManager. LoginButton chỉ là một nút mà khi nhấp vào, việc đăng nhập sẽ hoàn tất. Ở phía bên kia LoginManager tự thực hiện việc này. Trong trường hợp của bạn, bạn đã sử dụng LoginManager để đăng xuất tự động.

LoginManager.getInstance().logout() công việc này là dành cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.