В течение последних двух дней я снова ударял головой о facebook-sdk-for-android-wall и нуждался в помощи. Я не могу найти, что неправильно, что я должен сделать вместо этого или как проверить состояние, которое мне не хватает.
Мое приложение для Android записывает дорожки, а для трека пользователь должен выбрать отправку сводки на свою хронику. У меня есть работа как счастливый поток, но при тестировании различных сценариев, таких как отсутствие подключения к Интернету и т.д. Я сейчас застрял в состоянии, когда я получаю только сеанс: попытка была сделана для повторной авторизации сеанса с ожидающим запрос "-exception при попытке повторно авторизовать разрешения (даже при восстановлении интернет-соединения). Я использую SDK для facebook для Android и SSO.
package com.test;
import java.io.Fil...
...
public class FaceBookUtil {
public interface FacebookPostCallback {
void onComplete(String postId);
void onError(Exception e);
void onError();
}
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions", "publish_stream");
private static final int REAUTH_ACTIVITY_CODE = 100;
public static void postToFaceBook(final Track track, final Activity activity, final FacebookPostCallback postCallback) {
try {
Session session = initFacebookSession(activity.getApplicationContext());
Session.setActiveSession(session);
StatusCallback statusCallback = new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
try {
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
Session.ReauthorizeRequest reauthRequest = new Session
.ReauthorizeRequest(activity, PERMISSIONS)
.setRequestCode(REAUTH_ACTIVITY_CODE);
session.reauthorizeForPublish(reauthRequest); //Here where it breaks and the exceptions is thrown.
return;
}
Bundle postParams = new Bundle();
postParams.putString("name", "Facebook post test");
postParams.putString("caption", "Just a test");
postParams.putString("description", "A description");
postParams.putString("link", "http://www.google.com/");
Request.Callback reqCallback = new Request.Callback() {
public void onCompleted(Response response) {
String postId = null;
try {
FacebookException error = response.getError();
if (error != null)
throw error;
JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
postId = graphResponse.getString("id");
if (postId != null)
postCallback.onComplete(postId);
} catch (Exception e) {
postCallback.onError();
}
if (postId == null)
postCallback.onError();
}
};
Request postRequest = new Request(session, "me/feed", postParams, HttpMethod.POST, reqCallback);
RequestAsyncTask task = new RequestAsyncTask(postRequest);
task.execute();
} catch (Exception e) {
postCallback.onError(e);
}
}
};
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED))
session.openForRead(new Session.OpenRequest(activity).setCallback(statusCallback));
else if (!session.isOpened() && !session.isClosed()) {
OpenRequest req = new Session.OpenRequest(activity);
req.setCallback(statusCallback);
session.openForRead(req);
} else {
Session.openActiveSession(activity, true, statusCallback);
}
} catch (Exception e) {
postCallback.onError(e);
}
}
private static boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
private static Session initFacebookSession(Context context) {
Session session = Session.getActiveSession();
if (session != null)
return session;
/*
if (savedInstanceState != null)
session = Session.restoreSession(this, null, sessionStatusCallback, savedInstanceState);
*/
if (session == null)
session = new Session(context);
return session;
}
}
Если я отлаживаю SDK для Android, я вижу, что исключение выбрано методом reauthorize в классе Session, потому что pendingRequest не является нулевым, но я не понимаю, почему, где он установлен или как я могу проверить его, удалить его или точить, что я должен делать?
private void reauthorize(ReauthorizeRequest reauthorizeRequest, AuthorizationType authType) {
validatePermissions(reauthorizeRequest, authType);
validateLoginBehavior(reauthorizeRequest);
if (reauthorizeRequest != null) {
synchronized (this.lock) {
if (pendingRequest != null) { //Here where the pendingRequest is already set and causes the exception...
throw new UnsupportedOperationException(
"Session: an attempt was made to reauthorize a session that has a pending request.");
}
switch (this.state) {
case OPENED:
case OPENED_TOKEN_UPDATED:
pendingRequest = reauthorizeRequest;
break;
default:
throw new UnsupportedOperationException(
"Session: an attempt was made to reauthorize a session that is not currently open.");
}
}
authorize(reauthorizeRequest);
}
}
Я искал исключение без каких-либо результатов. Любая помощь очень ценится.
На стороне примечания я могу, вероятно, реорганизовать весь метод FacebookUtil.postToFaceBook, но при тестировании я сохранил его в одном методе для удобочитаемости.