시간과 시간을 소비 한 후 내 자신의 질문
응답은 그것을 알아 냈다. 여기의의 단계별 과정은 권한
를 읽고 게시 요청 설정 이클립스, 안드로이드, 페이스 북 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());
}
}
}
}
오류는 발생할 수
,
콜백을 실시하지 게시 할 수 있습니다. 사용자가 게시 권한 콜백을 반환하지 않을 때 동일한 시간이 지나면 사용자가 FB에 앱 설정 페이지가 표시되면 사용자가 앱에 게시 권한 을 부여한 것으로 표시됩니다. 이러한 시나리오에서는 기술적으로 우리가 readForOpen 호출에서받은 동일한 accessToken을 사용할 수 있습니다. 왜냐하면 대부분의 경우 accessToken은 성공적인 콜백 (즉, 결함이 아닌) 후에도 변경되지 않기 때문입니다. FB가 언제든지 accessToken을 변경할 수 있으므로 우리는 이에 의존 할 수 없습니다.
피하려면? - 조각과 기본 활동 모두에 onActivityResult가 있는지 확인하십시오. 그리고 Session.onActivityResult를 호출하십시오.
- 게시 콜백을 newRequest로 설정해야합니다. FB는 addCallback (newPermissionsRequest.getCallback())을 사용하여 NewPermissionsRequest에서 콜백 인스턴스를 다시 선택합니다. 당신이 권한을 게시를 요청할 경우에만
흥미롭게 같은 다른 페이스 북 사용자 로그인, FB SDK이 표시됩니다. 내부적으로 FB sdk는 이전 (기존 세션 fbid)과 비교 응답 (null 일 수 있음)을 "me"호출로 만들고이 두 SDK 사이에 차이가 있으면이 오류를 표시하여 fbid의 유효성을 검사합니다.
피하려면? - FB 애플리케이션을 올바르게 패키지 이름으로 설정했는지 확인하십시오. -이 사람은 나를 미친 사람으로 만들었습니다. PROXY를 사용하지 마십시오. 프록시 안드로이드 폰을 사용하는 동안 어떻게 든 FB SDK의 내부 "ME"호출은 FBID를 검증하는 데 실패합니다. com.facebook.FacebookException : 요청 본문을 작성할 수없고 그래프 사용자가 null이되어이 오류가 발생합니다. 비록 내가 보통의 가로 채기 프록시 인 피들러를 사용하고 있기 때문에 다소 이상하다.
나는 이것이 도움이되기를 바란다.
마지막으로 알아 냈습니다. 일단 완전히 테스트하면 완성 된 솔루션을 게시 할 것입니다. – user2095470