Я пытаюсь опубликовать сообщение на стене друзей, используя следующий код, который я взял из одного из их руководств. Я реализовал все методы жизненного цикла, но не ясно, что происходит.
Сценарий:
У меня есть активность и фрагмент, привязанный к входу в facebook -> я запрашиваю разрешения на чтение в этой настройке и заполняю свою БД соответствующей информацией, которую я получаю от Facebook.
Теперь у меня есть настройка вкладки, которая имеет разные фрагменты MainActivity и дочерние, два из этих дочерних элементов содержат списки, каждая строка этого списка связана с разными идентификаторами друзей Facebook. При нажатии кнопки facebook_post в этом списке я использую следующую функцию для публикации на стене друзей facebook:
if (isNetworkConnected()) {
Session session = Session.getActiveSession();
if (session != null) {
if(isLoggedIn()){
Toast.makeText(getActivity(),"Session not null and logged in", Toast.LENGTH_LONG).show();
if (hasPublishPermission()) {
System.out.println("Has publish");
Toast.makeText(getActivity(),"Session not null and logged in and publish too", Toast.LENGTH_LONG).show();
Bundle params = new Bundle();
params.putString("name", "Digital");
params.putString("link", "http://www.digitals.com/");
params.putString("picture","http://www.exar.com/images/frontend/logo.png");
params.putString("to", FACEBOOK_ID);
params.putString("caption", "Congrulations!");
params.putString("description", textGreeting);
params.putString("message", "message");
WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
getActivity(), Session.openActiveSessionFromCache(getActivity()),
params)).setOnCompleteListener(
new OnCompleteListener() {
@Override
public void onComplete(Bundle values,
FacebookException error) {
// frag3.setFbId(null);
// ---------------------------- got to put
// check here
// onBackPressed();
}
}).build();
feedDialog.show();
} else if (session.isOpened()) {
// We need to get new permissions, then complete the action
if (!hasPublishPermission())
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(getActivity(), PERMISSION));
Bundle params = new Bundle();
params.putString("name", "Digital");
params.putString("link", "http://www.digitals.com/");
params.putString("picture","http://www.exareceipts.com/images/frontend/logo.png");
params.putString("to", FACEBOOK_ID);
params.putString("caption", "Congrulations!");
params.putString("description", textGreeting);
params.putString("message", "message");
WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
getActivity(), Session.getActiveSession(),
params)).setOnCompleteListener(
new OnCompleteListener() {
@Override
public void onComplete(Bundle values,FacebookException error) {
// frag3.setFbId(null);
// ---------------------------- got to put
// check here
//onBackPressed();
}
}).build();
feedDialog.show();
}
}else{
Toast.makeText(getActivity(),"Please check if you are logged in", Toast.LENGTH_LONG).show();
mainFrag.setParam(1);
Intent mainIntent;
mainIntent = new Intent(getActivity(),FacebookMain.class);
getActivity().startActivity(mainIntent);
}
}
} else {
Toast.makeText(getActivity(),"Please check your internet connection", Toast.LENGTH_LONG).show();
}
}catch (Exception e){
System.out.println("Exception post fb: " +e);
Toast.makeText(getActivity(), "first construct"+e, Toast.LENGTH_SHORT).show();
}
это моя функция isLoggedIn:
public boolean isLoggedIn() {
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
return true;
} else {
return false;
}
}
Это мои методы LifeCycle (в текущем фрагменте):
private final String PENDING_ACTION_BUNDLE_KEY = "com.exa.dig:PendingAction";
private PendingAction pendingAction = PendingAction.NONE;
private GraphUser user1;
private enum PendingAction {
NONE, POST_PHOTO, POST_STATUS_UPDATE
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
};
public static boolean isActive() {
Session session = Session.getActiveSession();
if (session == null) {
return false;
}
return session.isOpened();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}
private void onSessionStateChange(Session session, SessionState state,
Exception exception) {
if (pendingAction != PendingAction.NONE && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) {
new AlertDialog.Builder(getActivity()) .setTitle("cancelled").setMessage("NotGranted").setPositiveButton("Ok", null).show();
pendingAction = PendingAction.NONE;
} else if (state == SessionState.OPENED_TOKEN_UPDATED) {
handlePendingAction();
}
updateUI();
}
public boolean isLoggedIn() {
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
return true;
} else {
return false;
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
private void updateUI() {
Session session = Session.getActiveSession();
boolean enableButtons = (session != null && session.isOpened());
if (enableButtons && user1 != null) {
// profilePictureView.setProfileId(user.getId());
// greeting.setText(getString(R.string.app_name, user.getFirstName()));
} else {
// profilePictureView.setProfileId(null);
// greeting.setText(null);
}
}
@SuppressWarnings("incomplete-switch")
private void handlePendingAction() {
PendingAction previouslyPendingAction = pendingAction;
// These actions may re-set pendingAction if they are still pending, but
// we assume they
// will succeed.
pendingAction = PendingAction.NONE;
}
private boolean hasPublishPermission() {
Session session = Session.getActiveSession();
return session != null && session.getPermissions().contains("publish_actions");
}
в onCreate:
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
//===============================================
Session.openActiveSessionFromCache(getActivity());
//================================================
Однако я получаю исключение:
java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request
Вышеупомянутое обычно происходит, когда я удаляю приложение FB со своего телефона, чтобы проверить, работает ли веб-диалог. Есть идеи?