11

Sto integrando Facebook accesso nella mia applicazione. Sono in grado di ottenere le autorizzazioni di lettura ma come ottenere le autorizzazioni di pubblicazione da Facebook SDK.Ottieni il permesso di pubblicazione_action dopo aver ottenuto le autorizzazioni di lettura da Facebook

Questo è come mi sto chiedendo i permessi di lettura:

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

Se l'utente ha concesso l'autorizzazione sono in grado di ottenere access_token e fare le mie cose su onActivityResult. Qui è quello che sto facendo con quel:

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

Ho letto Facebook Developer doc come spiegato qui Permissions - Facebook Developers, che non posso chiedere autorizzazioni di pubblicazione con autorizzazioni di lettura.

Il primo utente dovrà chiedere la lettura e quando l'utente si autorizza, possiamo chiedere autorizzazioni di pubblicazione.

Come è possibile ottenere le autorizzazioni di pubblicazione da Facebook accedere dopo aver concesso le autorizzazioni di lettura.

Qualsiasi tipo di aiuto sarà apprezzato.

+0

sono bloccato su login facebook. Posso accedere quando app nativa disponibile ma non in grado di accedere e autorizzare app se l'app nativa non è disponibile. ecco la mia domanda puoi fornire una risposta a questo. [http://stackoverflow.com/questions/21336314/facebook-after-login-not-coming-back-but-asking-login-again] –

+0

Ho commentato la tua domanda provalo e rispondi se funziona. – Anupam

risposta

18

Ho la risposta alla mia domanda. Basta aprire la sessione dopo aver ottenuto le autorizzazioni di lettura e quindi chiedere le autorizzazioni di pubblicazione. Ecco quello che ho fatto:

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

Aggiungi questo nel vostro 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; 
     } 
    } 

anche ottenere questo metodo integrato nel codice:

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

Facendo queste cose, io" Sono in grado di leggere anche le autorizzazioni di pubblicazione simultaneamente

Spero che questo aiuti gli altri.

+1

Ma apre nuovamente la finestra di login, che è semplice non accettabile dal punto di vista dell'utente. Posso farlo con l'utente che reinserisce il nome utente e la password. – jeevs

+0

@jeevs Penso che mostrare nuovamente il pop-up sia meglio che reinserire il nome utente e la password per l'accesso a Facebook. Ci sto lavorando per avere un flusso corretto come non mostrare il pop-up suActivityResult(). – Anupam

+0

Quel pop-up è login Pop up di Facebook SDK, mentre in background il post è pubblicato, quindi non serve a niente. Perché avremo bisogno del pop-up di accesso quando il post è già stato pubblicato. – jeevs

3

Dai documenti Facebook sdk 3.0 non è possibile concedere il permesso di lettura e pubblicazione simultaneamente. Ma una volta aperta la sessione con il permesso di lettura in seguito, è possibile aggiornare questa sessione per pubblicare il permesso, dalla classe UiLifecycleHelper. Una volta che lo stato della sessione cambia in SessionState.OPENED_TOKEN_UPDATED significa sessione aggiornata con autorizzazione di pubblicazione. Ecco un codice di esempio per te spero che questo ti aiuti.

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

Puoi dirmi come posso aggiornare il mio codice per ottenere quell'autorizzazione? Sarà molto utile. – Anupam

+0

// Verifica autorizzazioni di pubblicazione Elenco autorizzazioni = this.session.getPermissions(); if (! Permissions.containsAll (Arrays.asList (PERMISSIONS))) { this.requestPublishPermissions (this.session); questo.is_return = true; ritorno; } questa pace di codice controllerà se hai i permessi se sì publishStory sarà chiamato altrimenti il ​​metodo requestPublishPermissions aggiungerà il permesso con la tua sessione –

Problemi correlati