11

Jestem integratorem Facebook zaloguj się w mojej aplikacji. Mogę uzyskać uprawnienia do odczytu, ale jak uzyskać uprawnienia do publikowania z pakietu SDK Facebooka.Uzyskaj pozwolenie na publikację po uzyskaniu uprawnień do odczytu z Facebooka

ten sposób Pytam o uprawnienia do odczytu:

@Override 
public void onClick(View v) { 
Session currentSession = Session.getActiveSession(); 
if (currentSession == null 
    || currentSession.getState().isClosed()) { 
    Session session = new Session.Builder(context).build(); 
    Session.setActiveSession(session); 
    currentSession = session; 
} 

if (currentSession.isOpened()) { 
    // Do whatever u want. User has logged in 

} else if (!currentSession.isOpened()) { 
    // Ask for username and password 
    OpenRequest op = new Session.OpenRequest((Activity) context); 

    op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); 
    op.setCallback(null); 

    List<String> permissions = new ArrayList<String>(); 
    permissions.add("user_likes"); 
    permissions.add("email"); 
    permissions.add("user_birthday"); 
    permissions.add("user_location"); 
    permissions.add("user_interests"); 
    permissions.add("friends_birthday"); 
    op.setPermissions(permissions); 

    Session session = new Builder(MainActivity.this).build(); 
    Session.setActiveSession(session); 
    session.openForRead(op); 
    } 
} 
}); 

Jeśli użytkownik udzielił pozwolenia jestem w stanie dostać access_token i robi swoje rzeczy na onActivityResult. Oto, co robię z tym:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

super.onActivityResult(requestCode, resultCode, data); 
if (Session.getActiveSession() != null) 
    Session.getActiveSession().onActivityResult(this, requestCode, 
      resultCode, data); 

Session currentSession = Session.getActiveSession(); 
if (currentSession == null || currentSession.getState().isClosed()) { 
    Session session = new Session.Builder(context).build(); 
    Session.setActiveSession(session); 
    currentSession = session; 
} 

if (currentSession.isOpened()) { 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 

    @Override 
    public void call(final Session session, SessionState state, 
     Exception exception) { 

     if (session.isOpened()) { 

     Request.executeMeRequestAsync(session, 
      new Request.GraphUserCallback() { 

       @Override 
       public void onCompleted(GraphUser user, 
        Response response) { 
       if (user != null) { 

        TextView welcome = (TextView) findViewById(R.id.welcome); 
        TextView access_token_txt = (TextView) findViewById(R.id.access_token); 
        TextView email_txt = (TextView) findViewById(R.id.email);           

        access_token = session.getAccessToken(); 
        firstName = user.getFirstName(); 
        fb_user_id = user.getId();           

        access_token_txt.setText(access_token); 

        JSONObject graphResponse = response 
         .getGraphObject().getInnerJSONObject(); 

        fbEmail = null; 
        try { 
         fbEmail = graphResponse.getString("email"); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        email_txt.setText(fbEmail);           
        } 
       } 
      }); 
     } 
    } 
}); 
} 
} 

Czytałem Facebook Developer doc jak wyjaśniono tutaj Permissions - Facebook Developers, że nie mogę prosić publikować uprawnień z uprawnieniami do odczytu.

Pierwszy użytkownik będzie musiał poprosić o przeczytanie, a gdy użytkownik autoryzuje to, możemy poprosić o uprawnienia do publikowania.

W jaki sposób mogę uzyskać uprawnienia do publikowania z Facebooka po zalogowaniu się jako uprawnione do odczytu.

Każdy rodzaj pomocy zostanie doceniony.

+0

utknąłem na login facebook. Mogę się zalogować, gdy aplikacja natywna jest dostępna, ale nie mogę się zalogować i autoryzować aplikacji, jeśli natywna aplikacja nie jest dostępna. tutaj jest moje pytanie, czy możesz udzielić odpowiedzi na ten temat. [http://stackoverflow.com/questions/21336314/facebook-after-login-not-coming-back-but-asking-login-again] –

+0

Skomentowałem twoje pytanie wypróbuj i odpowiedz, czy to działa. – Anupam

Odpowiedz

18

Mam odpowiedź na moje pytanie. Wystarczy otworzyć sesję po uzyskaniu uprawnień do odczytu, a następnie poprosić o uprawnienia do publikowania. Oto co zrobiłem:

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
private boolean pendingPublishReauthorization = false; 

Dodaj ten w swojej onActivityResult:

Session session = Session.getActiveSession(); 

    if (session != null) { 

     // Check for publish permissions 
     List<String> permissions = session.getPermissions(); 
     if (!isSubsetOf(PERMISSIONS, permissions)) { 
      pendingPublishReauthorization = true; 
      Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
        this, PERMISSIONS); 
      session.requestNewPublishPermissions(newPermissionsRequest); 
      return; 
     } 
    } 

również uzyskać ten sposób zintegrowany w kodzie:

private boolean isSubsetOf(Collection<String> subset, 
     Collection<String> superset) { 
    for (String string : subset) { 
     if (!superset.contains(string)) { 
      return false; 
     } 
    } 
    return true; 
} 

Robiąc te rzeczy, ja” m stanie uzyskać jednocześnie prawa do publikowania jednocześnie.

Mam nadzieję, że to pomoże innym.

+1

Ale otwiera ponownie okno logowania, które jest proste nie do przyjęcia z punktu widzenia użytkownika. Czy mogę to zrobić, gdy użytkownik ponownie wprowadza nazwę użytkownika i hasło. – jeevs

+0

@jeevs Myślę, że ponowne wyświetlenie pop-up jest lepsze niż ponowne wprowadzenie nazwy użytkownika i hasła do logowania na Facebooku. Pracuję nad tym, aby mieć odpowiedni przepływ, np. Nie wyświetlając pop-up na onActivityResult(). – Anupam

+0

To wyskakujące okienko to login Popup of facebook SDK, podczas gdy w tle jest publikowany post, więc nie ma sensu. Dlaczego potrzebujemy wyskakującego okna logowania, gdy post jest już opublikowany. – jeevs

3

Z dokumentów sdk 3.0 na Facebooku nie można jednocześnie wydawać pozwolenia na odczyt i publikowanie. Ale gdy otworzysz sesję z uprawnieniami do odczytu, możesz zaktualizować sesję, aby opublikować pozwolenie, przez klasę UiLifecycleHelper. Gdy stan sesji zmieni się na SessionState.OPENED_TOKEN_UPDATED oznacza sesję zaktualizowaną o uprawnienia do publikowania. Oto przykładowy kod, który możesz mieć nadzieję, że ci to pomoże.

public class Example { 
    private static final int REAUTH_ACTIVITY_CODE = 100; 
    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream"); 
    private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_submit_post); 
    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 
    publishStory(); 
} 

private Session.StatusCallback callback = new Session.StatusCallback() { 

    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if (exception != null) { 
      new AlertDialog.Builder(SubmitPost.this) 
        .setMessage(exception.getMessage()) 
        .setPositiveButton("OK", null).show(); 
     } else { 
      SubmitPost.this.onSessionStateChange(session, state, exception); 
     } 
    } 
}; 

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 

if (state.isOpened()) { 
      if (pendingAnnounce && state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
       // Session updated with new permissions so try publishing once more. 
       pendingAnnounce = false; 
       //call your method here to publish something on facebook 
       publishStory(); 
      } 
     } 
    } 

private void requestPublishPermissions(Session session) { 
    if (session != null) { 
     pendingAnnounce = true; 
     Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS); 

     newPermissionsRequest.setRequestCode(REAUTH_ACTIVITY_CODE); 
     Session mSession = Session.openActiveSessionFromCache(this); 
     mSession.addCallback(callback); 
     mSession.requestNewPublishPermissions(newPermissionsRequest); 
    } 
} 

private void publishStory() { 

    // Check for publish permissions 
    List<String> permissions = this.session.getPermissions(); 
    if (!permissions.containsAll(Arrays.asList(PERMISSIONS))) { 
     this.requestPublishPermissions(this.session); 
     this.is_return = true; 
     return; 
    } 

    Session session = Session.getActiveSession(); 
    if (session != null) { 
     CreateFBPost(); 
    } 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
    case REAUTH_ACTIVITY_CODE: 
     Session session = Session.getActiveSession(); 
     if (session != null) { 
      session.onActivityResult(this, requestCode, resultCode, data); 
     } 
     break; 
    } 
} 
+0

Czy możesz mi powiedzieć, w jaki sposób mogę zaktualizować mój kod, aby uzyskać to pozwolenie? To będzie bardzo pomocne. – Anupam

+0

// Sprawdzanie uprawnień do publikowania Lista zezwoleń = this.session.getPermissions(); if (! Permissions.containsAll (Arrays.asList (PERMISSIONS))) { this.requestPublishPermissions (this.session); to.is_return = true; return; } Ten spokój kodu sprawdzi, czy masz uprawnienia, jeśli tak, publicznie zostanie nazwana opcja requestPublishPermissions metoda doda uprawnienia do twojej sesji –

Powiązane problemy