11

내 응용 프로그램에 Facebook 로그인을 통합 중입니다. 읽기 권한을 얻을 수 있지만 Facebook SDK에서 권한을 게시하는 방법은 얻을 수 있습니다. 사용자가 내가 access_token을 얻을 수 있어요 권한을 부여하는 경우Facebook에서 읽기 권한을 얻은 후 publish_action 권한을 받으십시오.

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

onActivityResult 내 일을 : 내가 읽기에 대한 사용 권한을 요청하고있어 어떻게

이입니다. 다음은 그와 함께하고 있어요 무엇 : 여기 Permissions - Facebook Developers 설명 된대로

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

것은 내가 읽기 권한으로 권한을 게시 요청 캔트, Facebook Developer 문서를 읽었습니다.

첫 번째 사용자는 읽기를 요청해야하며 사용자가이를 자동 작성하면 게시 권한을 요청할 수 있습니다.

Facebook에서 게시 권한을 얻으려면 어떻게해야합니까? 사용자에게 읽기 권한이 부여 된 후 로그인합니다.

모든 종류의 도움을 주실 수 있습니다.

+0

로그인 페이스 북에 붙어 있습니다. 기본 앱을 사용할 수있을 때 로그인 할 수 있지만 기본 앱을 사용할 수없는 경우 로그인하고 앱을 승인 할 수 없습니다. 여기 내 질문은 당신이 대답을 제공 할 수 있습니다. [http://stackoverflow.com/questions/21336314/facebook-after-login-not-coming-back-but-asking-login-again] –

+0

질문에 댓글을 달았습니다. 작동한다면 답해주세요. – Anupam

답변

18

는 내 질문에 대한 답을 가지고있다. 읽기 권한을 얻은 후에 세션을 연 다음 게시 권한을 요청하십시오. 여기에 내가 무엇을했는지 있습니다 :

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

은이를 추가하여 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; 
     } 
    } 

:이 일을함으로써

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

, I " 동시에 읽기 권한을 얻을 수 있습니다.

다른 사람들에게 도움이되기를 바랍니다.

+1

그러나 사용자 입장에서는 허용되지 않는 단순한 로그인 상자가 다시 열립니다. 사용자 이름과 비밀번호를 다시 입력해도됩니다. – jeevs

+0

@jeevs 나는 페이스 북 로그인을 위해 사용자 이름과 패스워드를 다시 입력하는 것보다 팝업을 다시 보여주는 것이 낫다고 생각한다. onActivityResult()에 팝업을 표시하지 않는 것과 같은 적절한 흐름을 갖기 위해 작업 중입니다. – Anupam

+0

그 팝업이 로그인입니다 페이스 북 SDK의 팝업, 백그라운드에서 게시물이 게시되므로 아무 소용이 없습니다. 게시물이 이미 게시되었을 때 로그인 팝업이 필요한 이유는 무엇입니까? – jeevs

3

facebook sdk 3.0 문서에서 읽기 및 게시 권한을 동시에 제공 할 수 없습니다. 하지만 나중에 읽기 권한이있는 세션을 열면 UiLifecycleHelper 클래스에 의해이 세션을 게시 권한으로 업데이트 할 수 있습니다. 세션 상태가 SessionState로 변경되면 OPENED_TOKEN_UPDATED는 게시 권한으로 업데이트 된 세션을 의미합니다. 이 코드가 도움이되기를 바랍니다.

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

해당 권한을 얻기 위해 내 코드를 어떻게 업데이트 할 수 있습니까? 그것은 매우 도움이 될 것입니다. – Anupam

+0

// 게시 권한 확인 목록 permissions = this.session.getPermissions(); if (! permissions.containsAll (Arrays.asList (PERMISSIONS))) { this.requestPublishPermissions (this.session); this.is_return = true; 반환; }이 코드를 사용하면 권한이 있는지 여부를 확인할 수 있습니다. 예를 들어 publishStory가 호출됩니다. else requestPublishPermissions 메소드가 세션에 권한을 추가합니다. –

관련 문제