2012-10-31 1 views
1

Android 용 새 Facebook SDK 3.0의 피드 대화 상자를 통합하는 데 문제가 있습니다. 문서화 방법은 매우 명확하지만 하나의 매우 중요한 경우는 생략하고 거의 발생하지 않는 것처럼 언급됩니다. 사용자가 뭔가를 게시하고 싶어하지만, 그는 이미 로그인하지 않은 및 세션 및 액세스 토큰이없는 경우 Android 용 Facebook SDK 3.0 - 이전 Facebook.Dialog와 새 세션 메커니즘을 통합하는 방법

Facebook Feed Dialog Documentation

경우입니다.

SDK는 이전 Facebook 개체에서 액세스 토큰 (및 전체 세션)을 설정하는 방법을 제공하지만 사용자가 로그인하여 자신의 피드를 게시 한 후 세션 또는 액세스 토큰을 얻는 방법을 찾을 수 없습니다. 피드 대화 상자.

그래서 흐름은 다음과 같습니다

  1. 사용자는 공유 버튼을 누른다. 그는 로그인하지 않은
  2. 은 그래서 세션 액세스 토큰이없는
  3. facebook.dialog()가 시작되고 로그인 대화 상자가 그가 다시 응용 프로그램에 그의 링크
  4. 사용자가 로그인을 발표하고 공유한다, 그러나 그는 세션 액세스 토큰이 없으며 페이스 북에 로그인하지 않았습니다. 단 1 분 전에 로그인했습니다.

내 질문에, 내가 (확실히 어딘가에 작성) 5 단계에서 액세스 토큰을 얻고 사용자가 유효을 가질 수 있도록, 유효한 SDK 3.0 세션 객체를 생성하는 내 프로그램에서 사용할 수있는 방법 페이스 북 대화 상자를 사용한 후 액세스 토큰으로 세션?

--- 편집 ---

난 그냥 네이티브 페이스 북의 응용 프로그램이 휴대 전화에 설치되어 있지 않은 경우 경우가 있음을 명확히 할

- 따라서 웹보기 대화 상자가 같아요 사용된다. 당신은 페이스 북의 클래스에 열린 세션을 설정하면

답변

6

, 대화 상자가()에 로그인 할 때 사용자에게 메시지를 표시하지 않아야 여기

은 예입니다.

public class MainActivity extends Activity { 
    boolean pendingShare; 
    Session session; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     if (savedInstanceState != null) { 
      pendingShare = savedInstanceState.getBoolean("pendingShare"); 
      session = Session.restoreSession(this, null, new SessionCallback(), savedInstanceState); 
     } 

     ((Button) findViewById(R.id.share_button)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       onClickShare(); 
      } 
     }); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean("pendingShare", pendingShare); 
     Session.saveSession(session, outState); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (session != null) { 
      session.onActivityResult(this, requestCode, resultCode, data); 
     } 
    } 

    private void onClickShare() { 
     pendingShare = true; 
     session = new Session(MainActivity.this); 
     session.openForRead(new Session.OpenRequest(MainActivity.this).setCallback(new SessionCallback())); 
    } 

    private void share(Session session) { 
     Facebook facebook = new Facebook(session.getApplicationId()); 
     facebook.setSession(session); 
     facebook.dialog(this, "feed", null); 
     pendingShare = false; 
    } 

    class SessionCallback implements Session.StatusCallback { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      if (state.isOpened() && pendingShare) { 
       share(session); 
      } 
     } 
    } 
} 

저장/복원 "pendingShare"(및 세션)은 여기에서 유용합니다. 왜냐하면 로그인 중에 Activity를 언로드 할 수 있기 때문에 MainActivity가 다시로드 될 때 dialog() 호출을 트리거하는 것을 기억합니다.

+0

문제는 이미 기존의 Session을 Facebook 클래스에서 재사용하는 것이 아니라 반대입니다. Session이없고 Facebook 클래스 (대화 상자)가 Session을 생성 한 후 사용하는 방법이 있다면. 이전에 수동으로 완료된 Facebook.setSession()이 없으면 Facebook.getSession()이 작동하지 않습니다. 그러나 이것은 사실이 아닙니다. – middlehut

+0

예. 로그인하기 전에 dialog()를 호출하면 어떤 토큰도 전화로 다시 돌아 오지 않으므로 사용자가 이름/비밀번호를 입력해야만 로그인 상태를 유지할 수 있습니다. 위의 샘플은 dialog()를 호출하고 싶을 때 아직 세션이 없으면 바로 세션. 사용자 경험은 세션을 처음 만들지 않는 경우와 동일하거나 더 좋습니다. – rightparen