2013-03-28 97 views
0

我正在尝试使用sdk 3.0在Facebook上发布图像,但我遇到了一些问题。如果我关闭应用程序并重新打开应用程序,它总是处于其他状态,然后在有条件的情况下进入。我需要保存session还是已经存储?有时无法上传照片在脸书3.0?

  Session mSession = Session.getActiveSession(); 

    if (mSession != null 
      && mSession.getPermissions().contains("publish_actions")) { 
     postPhoto(); 

    } else { 

     if (mSession == null) { 

      Log.d("Facebook", "Session null"); 
      mSession = new Session.Builder(this).setApplicationId(
        "xxxxxxxxxxxxxxx").build(); 
      Session.setActiveSession(mSession); 

     } 
     if (!mSession.isOpened()) { 

      Log.d("Facebook", "Session not opened"); 

      Session.OpenRequest sessionRequest = new Session.OpenRequest(
        this); 

      sessionRequest.setPermissions(PERMISSIONS); 
      sessionRequest.setCallback(statuscallback); 
      sessionRequest 
        .setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); 
      mSession.openForPublish(sessionRequest); 

     } 

    } 

StatusCallback statuscallback = new StatusCallback() { 

     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      // TODO Auto-generated method stub 

      if (session.isOpened()) { 

       Log.d("Facebook", "Logged in"); 
       postPhoto(); 

      } 
      if (session.isClosed()) { 

       Log.d("Facebook", "Logged out"); 
      } 
     } 
    }; 



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

      Log.d("Facebook", "onActivity Result"); 
     } 

如果我需要注销用户?

我尝试以下代码的onDestroy()

if (mSession.isOpened()) 
    mSession.closeAndClearTokenInformation(); 

每当我打开如果使用上面的代码中破坏方法它总是在这条线会引发错误的应用程序下一次

mSession.openForPublish(sessionRequest); 

请帮助家伙。答案/建议将非常可观。

感谢

回答

0

可以使用UiLifecycleHelper帮助在整个活动或片段生命周期管理活动的会话。通常,所有会话相关数据(访问令牌,权限等)都被缓存,并且如果您创建了新的Session(),它将使用缓存的数据(除非您调用closeAndClearTokenInformation,在这种情况下它将清除缓存)。我只会从用户的显式注销中调用closeAndClearTokenInformation(),否则只需在onDestroy()中调用close()。

我也会避免调用openForPublish。总是执行openForRead,然后调用session.getPermissions()检查是否拥有必要的权限,然后在需要更多时调用requestNewPublishPermissions。

+0

你能通过代码显示我吗?想要发布照片,那么为什么需要'openForRead'而不是'openForPublish' – ronie

+0

SDK附带的示例应用程序是如何使用UiLifecycleHelper以及Scrumptious应用程序(在SelectionFragment.java中)的最佳示例,其中包含示例关于如何请求发布权限。 –

+0

你不应该直接调用openForPublish的原因是因为它只在用户已经给你基本(默认)权限的情况下才起作用。 –