Отвечая на мой собственный вопрос
После тратить часы и часы, понял это. Здесь шаг за шагом процесс запрашиваемый читать и публиковать разрешения
Настройки Затмение, Android, Facebook 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) опубликовать разрешение не callsback
Это наиболее раздражающим один. Когда пользователь предоставляет разрешение на публикацию разрешения, никогда не возвращается, но тот же раз, если пользователь видит страницу настройки своего приложения в FB, он показывает, что пользователь предоставил разрешение публикации вам. В таком случае технически мы можем использовать тот же accessToken, который мы получили в вызове readForOpen, потому что в большинстве случаев accessToken не изменяется даже после успешных обратных вызовов (это не ошибка). Но мы не можем полагаться на это, так как FB может в любое время изменить accessToken.
Как этого избежать? - Убедитесь, что onActivityResult присутствует как в вашем фрагменте, так и в основной деятельности. И вызов Session.onActivityResult
- Убедитесь, что вы устанавливаете ответ на публикацию newRequest. FB выбирает экземпляр обратного вызова из NewPermissionsRequest с помощью addCallback (newPermissionsRequest.getCallback());
- 2) Пользователь вошел как другой пользователь Facebook
Интересно, что FB SDK показывает, что это только тогда, когда вы просите опубликовать разрешение. Внутренне FB sdk проверяет fbid, вызывая ответ «me», ответ сравнения (возврат может быть нулевым) с предыдущим (существующим сеансом fbid), и если есть разница между этими двумя SDK, эта ошибка.
Как этого избежать? - Убедитесь, что вы правильно настроили ваше приложение FB, особенно название упаковки. - Это сделало меня сумасшедшим. НЕ ИСПОЛЬЗУЙТЕ ПРОКСИ. при использовании прокси-телефона с Android-телефоном каким-то образом внутренний вызов «ME» FB SDK для проверки ошибок FBID с ошибкой com.facebook.FacebookException: не удалось создать тело запроса, и пользователь графика станет null и, следовательно, эта ошибка. Хотя это странно, потому что я использую скрипач, который является обычным перехватом прокси
Надеюсь, это поможет.
Наконец-то я понял это. Я отправлю полное решение, как только я его полностью проверю. – user2095470