2014-02-11 3 views
0

내 앱에서 먼저 사용자에게 기본 권한을 요청하고 필요할 때 게시합니다. 클라이언트 자체는 accessToken을 사용하여 서버에 전달하지 않습니다.Facebook 게시 권한 - 서버에서 게시

1) 기본 사용 권한을 얻은 클라이언트는 즉시 서버로 메시지를 보냅니다. 2) 클라이언트가 게시 권한을 요청하면 문제가 시작됩니다. 사용자가 게시 권한을 부여하면 세션에 이전 기본 사용 권한이 계속 표시됩니다. 하지만 같은 시간에 fb에서 사용자 설정을 확인하면 앱이 게시 권한을 부여 받았음을 보여줍니다. 하지만 어쨌든 앱에서 나는 accessToken을 업데이트하지 못하고 있습니다.

이 내가 허락을 게시 할 무엇이다

이 메서드 호출 후 (이 메소드가 불려) 사용자 부여 권한을 바로 옆에 Session.StatusCallback는 여전히 나에게 오래된 세션 권한을 보여줍니다 일단
private void requestPublishPermissions(Session session) { 
    if (session != null) { 
     Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSION) 
       // demonstrate how to set an audience for the publish permissions, 
       // if none are set, this defaults to FRIENDS 
       .setDefaultAudience(SessionDefaultAudience.FRIENDS) 
       .setRequestCode(REAUTH_ACTIVITY_CODE); 
     session.requestNewPublishPermissions(newPermissionsRequest); 
    } 
} 

.

내 질문 : 1) 퍼미션을 게시 한 직후에 새로 고친 accessToken을 얻는 방법은 무엇입니까? 2) (1)이 불가능한 경우 올바른 방법은 무엇입니까? 클라이언트로부터의 호출은 accessToken으로 업데이트되어야합니다. 업데이트 된 accessToken이 생길 때까지 사용자를 기다리게합니까? 그렇다면 어떻게?

감사합니다.

+0

마지막으로 알아 냈습니다. 일단 완전히 테스트하면 완성 된 솔루션을 게시 할 것입니다. – user2095470

답변

2

시간과 시간을 소비 한 후 내 자신의 질문

응답은 그것을 알아 냈다. 여기의의 단계별 과정은 권한

를 읽고 게시 요청 설정 이클립스, 안드로이드, 페이스 북 SDK 3.6 프로그램 MainActivity와 정적 조각 달성하려는? 읽기 권한을 요청한 다음 사용 권한을 게시하십시오.

MainActivity

public class YourFragmentActivity extends FragmentActivity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Static Fragment 
    setContentView(R.layout.fragment_layout); 
} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
} 
} 

YourFragment.java

public class YourFragment extends Fragment { 
public static String TAG = YourFragment.class.getSimpleName(); 

private static final List<String> PERMISSIONS = Arrays.asList("publish_stream, publish_actions"); 

// Flag to represent if we are waiting for extended permissions 

private Session.StatusCallback statusCallback = new SessionStatusCallback(); 
private Session.StatusCallback publishCallback = new PublishCallback(); 

private Button publish; 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment, container, false); 

    buttonLoginLogout = (Button) view.findViewById(R.id.buttonLoginLogout); 
    publish = (Button) view.findViewById(R.id.publish); 


      //Make Sure you have session when you instantiate fragment 
    Session session = Session.getActiveSession(); 
    if (session == null) { 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(getActivity()); 
     } 
     Session.setActiveSession(session); 
     if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
     } 
    } 

    onSessionStateChange(); 

    return view; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    Session.getActiveSession().addCallback(statusCallback); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    Session.getActiveSession().removeCallback(statusCallback); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    Session session = Session.getActiveSession(); 
    Session.saveSession(session, outState); 
} 

private void onSessionStateChange() { 
    Session session = Session.getActiveSession(); 

    if(session.getPermissions().contains("publish_actions")){ 

       //You got you updated token here with extended permissions 
    } 
    if (session.isOpened()) { 

       //Do you stuff here. e.g Getting accessToken, expiry etc. 

    } 
    else { 
    } 
} 

public void requestPublishPermissions(Activity activity, Session session, List<String> permissions, int requestCode) { 

    if (session != null) { 
     Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(activity, permissions).setRequestCode(requestCode); 
     reauthRequest.setCallback(publishCallback); 

     session.requestNewPublishPermissions(reauthRequest); 
    } 
} 

    //Set this on onclick call of some button in you fragment 
private void openForRead() { 
    Session session = Session.getActiveSession(); 
    if (!session.isOpened() && !session.isClosed()) { 
     session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
    } 
    else { 
     Session.openActiveSession(getActivity(), this, true, statusCallback); 
    } 
} 

    //Set this on onclick call of some logout button in you fragment 
private void logMeOut() { 
    Session session = Session.getActiveSession(); 
    if (!session.isClosed()) { 
     session.closeAndClearTokenInformation(); 
    } 
} 

private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(); 
     Debug.waitForDebugger(); 
     if (exception != null){ 
          //Handel your exception case here 
      Log.i(TAG, exception.getMessage()); 
        } 
    } 
} 

private class PublishCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     Debug.waitForDebugger(); 
     onSessionStateChange(); 
     if (exception != null){ 
          //Handel your exception case here 
      Log.i(TAG, exception.getMessage()); 
        } 
    } 
} 
} 

오류는 발생할 수

,
  • 1) 권한이 가장 짜증나는 하나입니다

콜백을 실시하지 게시 할 수 있습니다. 사용자가 게시 권한 콜백을 반환하지 않을 때 동일한 시간이 지나면 사용자가 FB에 앱 설정 페이지가 표시되면 사용자가 앱에 게시 권한 을 부여한 것으로 표시됩니다. 이러한 시나리오에서는 기술적으로 우리가 readForOpen 호출에서받은 동일한 accessToken을 사용할 수 있습니다. 왜냐하면 대부분의 경우 accessToken은 성공적인 콜백 (즉, 결함이 아닌) 후에도 변경되지 않기 때문입니다. FB가 언제든지 accessToken을 변경할 수 있으므로 우리는 이에 의존 할 수 없습니다.

피하려면? - 조각과 기본 활동 모두에 onActivityResult가 있는지 확인하십시오. 그리고 Session.onActivityResult를 호출하십시오.

- 게시 콜백을 newRequest로 설정해야합니다. FB는 addCallback (newPermissionsRequest.getCallback())을 사용하여 NewPermissionsRequest에서 콜백 인스턴스를 다시 선택합니다. 당신이 권한을 게시를 요청할 경우에만

  • 2) 사용자가

흥미롭게 같은 다른 페이스 북 사용자 로그인, FB SDK이 표시됩니다. 내부적으로 FB sdk는 이전 (기존 세션 fbid)과 비교 응답 (null 일 수 있음)을 "me"호출로 만들고이 두 SDK 사이에 차이가 있으면이 오류를 표시하여 fbid의 유효성을 검사합니다.

피하려면? - FB 애플리케이션을 올바르게 패키지 이름으로 설정했는지 확인하십시오. -이 사람은 나를 미친 사람으로 만들었습니다. PROXY를 사용하지 마십시오. 프록시 안드로이드 폰을 사용하는 동안 어떻게 든 FB SDK의 내부 "ME"호출은 FBID를 검증하는 데 실패합니다. com.facebook.FacebookException : 요청 본문을 작성할 수없고 그래프 사용자가 null이되어이 오류가 발생합니다. 비록 내가 보통의 가로 채기 프록시 인 피들러를 사용하고 있기 때문에 다소 이상하다.

나는 이것이 도움이되기를 바란다.