फेसबुक लॉगिन / लॉगआउट बटन का उपयोग किए बिना, प्रोग्राम को फेसबुक एसडीके 3.0 से लॉग आउट कैसे करें?


80

शीर्षक ही सब कुछ कह देता है। मैं उपयोगकर्ता की फ़ेसबुक सूचना ("साइन अप" उद्देश्यों के लिए) लाने के लिए एक कस्टम बटन का उपयोग कर रहा हूँ। फिर भी, मैं नहीं चाहता कि ऐप अंतिम पंजीकृत उपयोगकर्ता को याद रखे और न ही वर्तमान में फेसबुक देशी ऐप के माध्यम से व्यक्ति को लॉग इन किया जाए। मैं चाहता हूं कि फेसबुक लॉगिन गतिविधि हर बार पॉप अप हो। यही कारण है कि मैं किसी भी पिछले उपयोगकर्ताओं को प्रोग्रामेटिक रूप से लॉग आउट करना चाहता हूं।

मैं उसे कैसे कर सकता हूँ? इस तरह से मैं लॉगिन करता हूं:

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

आदर्श रूप में, मैं किसी भी पिछले उपयोगकर्ताओं को लॉग आउट करने के लिए इस पद्धति की शुरुआत में एक कॉल करूंगा।

जवाबों:


161

नवीनतम एसडीके के लिए अपडेट:

अब फेसबुक एसडीके v4.7 + के लिए @ zeuter का उत्तर सही है:

LoginManager.getInstance().logOut();

मूल उत्तर:

कृपया SessionTracker का उपयोग न करें। यह एक आंतरिक (पैकेज निजी) वर्ग है, और इसका उपयोग सार्वजनिक एपीआई के हिस्से के रूप में नहीं किया जाता है। इस प्रकार, किसी भी समय पश्चगामी संगतता गारंटी के बिना इसका API बदल सकता है। आपको अपने कोड में SessionTracker के सभी उदाहरणों से छुटकारा पाने में सक्षम होना चाहिए, और इसके बजाय सक्रिय सत्र का उपयोग करना चाहिए।

अपने प्रश्न का उत्तर देने के लिए, यदि आप कोई सत्र डेटा नहीं रखना चाहते हैं, तो जब आपका ऐप बंद हो जाता है , तो बस CloseAndClearTokenInformation पर कॉल करें ।


3
आप बस Session.getActiveSession को कॉल करते हैं, और यदि यह रिक्त हो जाता है, तो आप या तो 1.) Session.Builder का उपयोग करके एक नया सत्र बना सकते हैं, और Session.setActiveSession, या 2. कॉल कर सकते हैं। Session.openActiveSession विधियों में से एक कॉल करें (स्टेटिक वे, जो दोनों आपके लिए सक्रिय सत्र खोलते हैं और सेट करते हैं)।
मिंग ली

24
और यह तथ्य कि आपको लॉगआउट करने के लिए एक सत्र खोलना है, यह दिखाता है कि फेसबुक एसडीके डिज़ाइन कितना खराब है ... मानक कॉलबैक के साथ एक साधारण सार्वजनिक एपीआई की पेशकश करने के बजाय, आपको एक भद्दा तंत्र लागू करना होगा ... अद्भुत।
मार्टिन मार्कोसिनी

18
फेसबुक एसडीके और प्रलेखन दयनीय है!
स्काईनेट

3
आधिकारिक फेसबुक डॉक्स में उदाहरणों में कोड शामिल है जो कि पदावनत है - फिर हमें पुराने पुराने स्टैक इनवर्टर को अन-डिप्रेक्ट करने के लिए संदर्भित करना होगा।
स्काईनेट

1
उन टिप्पणियों को जोड़ने के बजाय जो वार्तालाप में योगदान नहीं करती हैं, आपको ऐसे विशिष्ट उदाहरण देने चाहिए, जहाँ दस्तावेज़ की कमी है (प्रश्न / उत्तर से संबंधित), या आप डेवलपर पोर्टल पर किसी विशेष दस्तावेज़ पृष्ठ के नीचे जा सकते हैं, और क्लिक करें "क्या यह दस्तावेज़ मददगार था?" के लिए "नहीं" बटन पर।
मिंग ली

87

यह विधि आपको एंड्रॉइड में प्रोग्रामेटिक रूप से फेसबुक से लॉगआउट करने में मदद करेगी

/**
 * 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
मेरे लिए गतिविधियों के बजाय टुकड़ों का उपयोग करने के मामले में एकमात्र काम करने वाला समाधान था!
रोजर एलियन

आपके पास कोड में अन्य भाग क्यों है? यदि उपयोगकर्ता लॉग इन नहीं है, तो उसे फिर से लॉग इन करना होगा और फिर लॉग आउट करना होगा?
विहान वर्मा

1
त्रुटि java.lang.NullPointerException: तर्क 'ApplicationId' शून्य नहीं हो सकता है
क्रुनाल शाह

मुझे लगता है कि सत्र को आरंभ करने का उपयुक्त तरीका नया सत्र है। आधार (संदर्भ) .build ();
हसन

66

चूंकि Facebook का Android SDK v4.0 ( चैंज देखें ) आपको निम्नलिखित कार्य करने की आवश्यकता है:

LoginManager.getInstance().logOut();

7
धन्यवाद, लेकिन मैं यह नहीं देख रहा हूं कि यह वास्तव में सत्र को मंजूरी देता है। LoginManager.logout () केवल आंतरिक रूप से कॉल करता है "AccessToken.setCurrentAccessToken (null); Profile.setCurrentProfile (null);"। मैं देख रहा हूं कि उपयोगकर्ता अगली बार जब भी वे ऐप लॉन्च करते हैं, तब क्रेडेंशियल्स को फिर से दर्ज किए बिना लॉग इन कर सकते हैं। आप उपयोगकर्ता को अपनी साख फिर से दर्ज करने के लिए कैसे मजबूर करते हैं?
स्वोबी

इस विधि ने मेरी मदद की। इसे कॉल करने और फिर से लॉगिन करने की कोशिश करने के बाद, एक एंटर-क्रेडेंशियल्स स्क्रीन दिखाई दी, जैसा कि अपेक्षित था। अनेक अनेक धन्यवाद।
Zsolt Boldizsár

1
जैसा कि @swooby ने बताया, यह समाधान दुर्भाग्य से facebook sdk v4.x का उपयोग करने वाले ऐप्स पर काम नहीं करता है। लॉगऑन के बाद, AccessToken [{AccessToken token: ACCESS_TOKEN_REMOVED अनुमतियाँ: [public_profile]}]] है लेकिन AccessToken.getCurrentAccessToken () () पर मिल जाएगा। स्ट्रिंग भले ही उपयोगकर्ता अब लॉग न हो या एप्लिकेशन को प्राधिकरण रद्द कर दिया गया हो।
लिसिट्सो

@Lisitso क्या आप अब इसके लिए कोई समाधान जानते हैं?
19

1
@Jaec मैंने "अनिकेत ठाकुर" द्वारा प्रमाणित समाधान का उपयोग किया। आप अन्य रिस्पॉन्स के बीच यहां पा सकते हैं। चीयर्स!
लिसिट्सो

27

यहाँ स्निपेट है जिसने मुझे फेसबुक से प्रोग्रामेटिक रूप से लॉग आउट करने की अनुमति दी है। मुझे बताएं कि क्या आपको ऐसा कुछ दिखाई दे रहा है, जिसमें मुझे सुधार करने की आवश्यकता है।

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 क्या है?
अमितशर्मा

एप्लिकेशन क्लास का एक उदाहरण जो किसी भी एंड्रॉइड एप्लिकेशन में उपलब्ध है
ईएनविनियसबल

13

Facebook के Android SDK v4.0 के बाद से आपको निम्नलिखित कार्य करने होंगे:

LoginManager.getInstance().logOut();

यह पर्याप्त नहीं है। यह केवल टोकन कैश की गई पहुँच स्पष्ट और इतना है कि प्रोफ़ाइल जाएगा AccessToken.getCurrentAccessToken()और Profile.getCurrentProfile()अब अशक्त हो जाएगा।

पूरी तरह से लॉगआउट करने के लिए आपको अनुमतियों को रद्द करना होगा और फिर कॉल करना होगा LoginManager.getInstance().logOut();। ग्राफ़ API के बाद अनुमति निष्पादित करने के लिए -

    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
यह इस प्रश्न का सही उत्तर है। LoginManager.getInstance().logOut();केवल स्थानीय कैश को साफ़ करता है, जबकि GraphRequestकॉल प्रोग्राम उपयोगकर्ता के फेसबुक खाते से ऐप एक्सेस को रद्द कर देता है। दोनों आवश्यक हैं। न अकेले काफी है।
YS

जहाँ हमें यह कोड डिलीट परमिशन के लिए डालना है ?! मेरे मामले में कोड काम नहीं कर रहा है! क्या आप पूर्ण कोड स्निपेट मुहैया करा सकते हैं?
अक्षय शिंदे

कोड काम कर रहा है, लेकिन चेतावनी दे रहा है: बिना गुम हुए आवेदन आईडी या ग्राहक के टोकन का अनुरोध करें। क्या मुझे उपरोक्त कोड में "/ {user-id} / अनुमतियां /" में कुछ जोड़ने की आवश्यकता है?
जीशान

@zeeshan मेरे साथ {user-id} को प्रतिस्थापित करते हैं
अमृतपाल सिंह

8

एसडीके 4.0 पर सत्र वर्ग हटा दिया गया है। लॉगिन प्रबंधन वर्ग LoginManager के माध्यम से किया जाता है । इसलिए:

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

संदर्भ के रूप में एसडीके 4.0 में उन्नयन कहते हैं:

सत्र हटा दिया गया - सत्र क्लास में AccessToken, LoginManager और CallbackManager वर्ग सुपरसीड और कार्यक्षमता को प्रतिस्थापित करते हैं।


1
Zeuter का उत्तर छोटा है और एक ही api कॉल को इंगित करता है। नकल क्यों?
rekire

3

Yup, जैसा कि @luizfelippe ने उल्लेख किया है कि SDK 4.0 के बाद से सत्र वर्ग हटा दिया गया है हमें LoginManager का उपयोग करने की आवश्यकता है।

मैंने सिर्फ लॉगआउट के लिए लॉगिनबटन क्लास में देखा । वे इस तरह का चेक बना रहे हैं। वे केवल तभी लॉग आउट करते हैं यदि एक्सेसटोकन शून्य नहीं है। इसलिए, मुझे लगता है कि हमारे कोड में भी यह बेहतर है।

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

Zeuter का उत्तर छोटा है और एक ही api कॉल को इंगित करता है। नकल क्यों?
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

फेसबुक एक अकाउंट से लॉगइन और लॉगआउट करने के दो तरीके प्रदान करता है। एक है LoginButton का उपयोग करना और दूसरा है LoginManager का उपयोग करना। LoginButton सिर्फ एक बटन है जिसे क्लिक करने पर, लॉगिंग पूरा हो जाता है। दूसरी तरफ LoginManager अपने दम पर ऐसा करता है। आपके मामले में आपके पास लॉगआउट करने के लिए लॉगिन मैनजर का उपयोग स्वचालित रूप से होता है।

LoginManager.getInstance().logout() क्या यह आपके लिए कार्य करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.