2013-01-22 18 views
5

के दौरान लॉगिन प्रमाण-पत्रों के लिए कहा जाता है, मैं अपने एंड्रॉइड ऐप में नया फेसबुक एसडीके 3.0 लागू करने की कोशिश कर रहा हूं और मैंने एक समस्या में भाग लिया है। मेरी समस्या यह है कि उपयोगकर्ता को पढ़ने की अनुमति ("post_to_wall") अनुमति देने के लिए फिर से लॉग इन करने के लिए कहा जाता है, भले ही उपयोगकर्ता पहले से लॉग इन अनुमतियों के साथ लॉग इन हो। यह तब होता है जब उपयोगकर्ता के पास एफबी एप्लीकेशन स्थापित नहीं होता है। अगर उसके पास एफबी एप्लीकेशन स्थापित है, तो उसे केवल अनुमति देने के लिए कहा जाता है।उपयोगकर्ता को पुनः प्राधिकरण

public void call(final Session session, final SessionState state, final Exception exception) { 
    if (session.isOpened()) { 
     if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
      // code if new permissions have been granted 
     } else { 
      // code for login 
     } 
    } else if (session.isClosed()) { 
      // code for user canceled login 
     } else if (exception != null) { 
      // code if there were errors during login 
     } 
    } 
} 

इस कोड मैं गतिविधि जिसे प्रवेश कॉल की onActivityResult विधि को जोड़ा गया है:

public void login(Activity activity) { 
    Session session = Session.getActiveSession(); 

    if (session == null || !session.isOpened()) { 
     openActiveSession(activity, true, sessionStatusCallback); 
    } 
} 

private Session openActiveSession(final Activity activity, final boolean allowLoginUI, final StatusCallback callback) { 
    return openActiveSession(activity, allowLoginUI, new OpenRequest(activity).setCallback(callback)); 
} 

private Session openActiveSession(final Context context, final boolean allowLoginUI, final OpenRequest openRequest) { 
    Session session = new Builder(context).setApplicationId(FACEBOOK_APPLICATION_ID).build(); 
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) { 
     Session.setActiveSession(session); 
     session.openForRead(openRequest); 
     return session; 
    } 
    return null; 
} 

इसके लिए कॉलबैक के कॉल विधि है:

यह मैं कैसे लॉगिन लागू किया है:

Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data); 

और यह मैं कैसे नई अनुमतियां मांगेंगे है:

Session session = Session.getActiveSession(); 
if (session != null && session.isOpened()) {  
    if (DONT_HAVE_PERMISSIONS) { 
     Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, 
          FACEBOOK_PERMISSIONS).setRequestCode(FACEBOOK_AUTHORIZE_ACTIVITY_CODE); 
     session.requestNewPublishPermissions(newPermissionsRequest); 
    } 
} 

मैंने इस समस्या के बारे में और जानने के लिए प्रयास किया है, और मुझे केवल कुछ संकेत मिले हैं कि इसका इरादा है, लेकिन मुझे कुछ भी ठोस नहीं मिला है।

क्या यह डिफ़ॉल्ट व्यवहार है? यदि हां, तो क्या इसके आसपास कोई रास्ता है? या, शायद मैंने कुछ गलत किया?

सहायता के लिए धन्यवाद।

उत्तर

0

facebooks स्रोत कोड को देखते हुए मुझे लगता है कि यह अनुमतियाँ दोनों प्रवेश के रूप में सीधे प्राप्त करने की कोशिश शुरू करने के लिए संभव हो जाना चाहिए, और अनुमतियाँ कक्षाएं एक ही AuthorizationRequest वर्ग से निकाले जाते हैं, और AuthorizationRequest वर्ग सब काम, जैसे वास्तव में सब करता है काम। सत्र। न्यूप्रमिशन रिवेस्ट क्लास कुछ प्राइवेट विधियों को बनाता है, AuthorizationRequest क्लास में सार्वजनिक है और यही वह है! वे हमें सीधे AuthorizationRequest तक पहुंच भी दे सकते हैं। नए फेसबुक एपीआई में "ऑनफेल/ऑनस्यूप" कॉलबैक का कोई भी प्रतीत नहीं होता है, इसलिए मैं फेसबुक को फायर करने के लक्ष्य को याद रखने के लिए एक राज्य मशीन खोल रहा हूं (लॉगिन, अनुमतियां, दोस्तों की सूची प्राप्त करें ...), और मैं किस कदम पर हूं। अगर उन्होंने कुछ प्रकार के फेल/ऑनसेफ कॉलबैक किए हैं तो राज्य मशीन का ट्रैक रखने के बजाए श्रृंखला बनाना आसान होगा।

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

अद्यतन

मैं इसे केवल एक बार क्रेडेंशियल के लिए पूछ के रूप में मैं ऊपर बताया गया है के साथ काम मिल गया।

  1. गोटो src/com/फेसबुक/Sessions.java
  2. लाइन 862 पर आप

    private static Session openActiveSession(Context context, boolean allowLoginUI, OpenRequest openRequest) 
    
  3. यह एक सार्वजनिक समारोह हो सकता है और बचाने के लिए कर सकते हैं।

अब सत्र बनाने के बजाय। NEWPermissionsRequest ऑब्जेक्ट। सत्र बनाओ

 permisions = new ArrayList<String>(); 
     permisions.add("user_photos"); 
     permisions.add("friends_photos"); 
     Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(
       activity, permisions); 
     request.setCallback(helper); 

     if (Session.getActiveSession() != null) 
      Session.getActiveSession().requestNewReadPermissions(request); 
     else { 
      Session.OpenRequest orequest = new Session.OpenRequest(activity); 
      orequest.setPermissions(permisions); 
      orequest.setCallback(helper); 
          // its now public so you can call it 
      Session.openActiveSession(act, true, request); 
     } 

OpenRequest अब, सुनिश्चित करें कि आप एक कॉलबैक सेट करना एक महत्वपूर्ण कारण

@Override 
public void call(Session session, SessionState state, Exception exception) { 
    if (state.isClosed()) { 
        // we are doing unofficial stuff so we loose guarantees. 
        // Set the active session to null if we logout or user cancels 
        // logging in. If you don't do this, the second time it will result 
        // in a crash. 
     Session.setActiveSession(null); 
    } 
} 

अब यह सीधे सभी अनुमतियां मांगेंगे और एक ही बार में लॉग इन के लिए।

संबंधित मुद्दे