2013-02-09 23 views
4

下面的代碼用於在android中使用facebookSDK3.0發佈狀態更新。如果我使用UiLifeCycleHelper類,它的工作良好。但我想在Facebook上發佈狀態,而不使用UiLifeCycleHelper類。我嘗試了下面的代碼,它在我的logcat中拋出錯誤,並且我的應用程序被強制關閉。java.lang.UnsupportedOperationException:Session:嘗試請求具有未決請求的會話的新權限

public class SampleFBPostActivity extends Activity implements OnClickListener { 

private EditText mPostEditText; 
private Button mDoneButton; 
private Session mSession; 
private PendingAction pendingAction = PendingAction.NONE; 

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
private enum PendingAction { 
    NONE, 
    POST_STATUS_UPDATE 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fb_post); 
    mPostEditText = (EditText) findViewById(R.id.post_text); 
    mDoneButton = (Button) findViewById(R.id.done_button); 
    mDoneButton.setOnClickListener(this); 
    mSession = Session.getActiveSession(); 
    if (mSession == null) { 
     mSession = new Session(this); 
     Session.setActiveSession(mSession); 
    } 
    updateUI(); 
    handlePendingAction(); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.done_button: 
     onClickPostStatusUpdate(); 
     break; 
    } 
} 

private interface GraphObjectWithId extends GraphObject { 
     String getId(); 
    } 

private void showPublishResult(String message, GraphObject result, FacebookRequestError error) { 
     String title = null; 
     String alertMessage = null; 
     if (error == null) { 
      title = getString(R.string.success); 
      String id = result.cast(GraphObjectWithId.class).getId(); 
      alertMessage = getString(R.string.successfully_posted_post, message, id); 
     } else { 
      title = getString(R.string.error); 
      alertMessage = error.getErrorMessage(); 
     } 

     new AlertDialog.Builder(this) 
       .setTitle(title) 
       .setMessage(alertMessage) 
       .setPositiveButton(R.string.ok, null) 
       .show(); 
    } 

    private void onClickPostStatusUpdate() { 
     performPublish(PendingAction.POST_STATUS_UPDATE); 
    } 

    private void postStatusUpdate(final String message) { 
     if (mSession != null && hasPublishPermission()) { 
      Request request = Request 
        .newStatusUpdateRequest(Session.getActiveSession(), message, new Request.Callback() { 
         @Override 
         public void onCompleted(Response response) { 
          showPublishResult(message, response.getGraphObject(), response.getError()); 
         } 
        }); 
      request.executeAsync(); 
     } else { 
      pendingAction = PendingAction.POST_STATUS_UPDATE; 
     } 
    } 

    private boolean hasPublishPermission() { 
     Session session = Session.getActiveSession(); 
     return session != null && session.getPermissions().contains("publish_actions"); 
    } 

    private void performPublish(PendingAction action) { 
     Session session = Session.getActiveSession(); 
     if (session != null) { 
      pendingAction = action; 
      if (hasPublishPermission()) { 
       handlePendingAction(); 
      } else { 
       session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, PERMISSIONS)); 
      } 
     } 
    } 

private void updateUI() { 
    Session session = Session.getActiveSession(); 
    boolean enableButtons = (session != null && session.isOpened()); 
    mDoneButton.setEnabled(enableButtons); 
} 

private void handlePendingAction() { 
     PendingAction previouslyPendingAction = pendingAction; 
     pendingAction = PendingAction.NONE; 

     switch (previouslyPendingAction) { 

      case POST_STATUS_UPDATE: 
       postStatusUpdate(mPostEditText.getText().toString()); 
       break; 
     } 
    } 
} 

下面是在logcat的錯誤:

02-09 14:00:36.126: E/AndroidRuntime(2396): java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request. 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.facebook.Session.requestNewPermissions(Session.java:968) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.facebook.Session.requestNewPublishPermissions(Session.java:501) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.facebook.samples.sessionlogin.SampleFBPostActivity.performPublish(SampleFBPostActivity.java:113) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.facebook.samples.sessionlogin.SampleFBPostActivity.onClickPostStatusUpdate(SampleFBPostActivity.java:83) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.facebook.samples.sessionlogin.SampleFBPostActivity.onClick(SampleFBPostActivity.java:54) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at android.view.View.performClick(View.java:3511) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at android.view.View$PerformClick.run(View.java:14105) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at android.os.Handler.handleCallback(Handler.java:605) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at android.os.Handler.dispatchMessage(Handler.java:92) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at android.os.Looper.loop(Looper.java:137) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at android.app.ActivityThread.main(ActivityThread.java:4424) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at java.lang.reflect.Method.invokeNative(Native Method) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at java.lang.reflect.Method.invoke(Method.java:511) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    02-09 14:00:36.126: E/AndroidRuntime(2396): at dalvik.system.NativeStart.main(Native Method) 

請幫我在您的解決方案不使用UiLifeCycleHelper類。在此先感謝

回答

7

是否有一個特別的原因,你不想使用UiLifecycleHelper?這門課專門爲了讓你的生活更輕鬆,所以你不會遇到這樣的問題。

如果您需要,最簡單的方法是查看UiLifecycleHelper中的代碼,並將它們複製到Activity中的相應方法。

針對您的特殊活動,我看到了兩個錯誤:

  1. 你不會在任何時候打開的會話(您直接致電requestNewPublishPermissions,但你必須先打開會話)。調用「新會話」不會打開它。

  2. 您不重寫onActivityResult方法,這是將信息傳遞迴活動會話所必需的方法。

+0

如果我們正在實施回調,我們是否需要打開會話?如果是,那麼如何? – 2015-07-03 12:34:35

0

請嘗試以下代碼。這是張貼更新最簡單的例子:

把代碼seeson登錄後:

session.addCallback(new StatusCallback() { 

    @Override 
    public void call(Session session, SessionState state, 
     Exception exception) { 
     List<String> PERMISSIONS = Arrays 
      .asList("publish_actions"); 
     session 
      .requestNewPublishPermissions(new Session.NewPermissionsRequest(
       getActivity(), PERMISSIONS)); 

     Request request = Request.newStatusUpdateRequest(
      session, "Temple Hello Word Sample", 
      new Request.Callback() { 
       @Override 
       public void onCompleted(Response response) { 
        L.d("fb:done = " 
         + response.getGraphObject() + "," 
         + response.getError()); 
       } 
      }); 
     request.executeAsync(); 

    } 

}); 

以下是整個代碼是從Facebook SDK3.0的樣本會話登錄:

package com.facebook.samples.sessionlogin; 

import java.util.Arrays; 
import java.util.List; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 

import com.facebook.LoggingBehavior; 
import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.Session.StatusCallback; 
import com.facebook.SessionState; 
import com.facebook.Settings; 
import com.microtemple.android.lib.common.L; 

public class SessionLoginFragment extends Fragment { 
    private static final String   URL_PREFIX_FRIENDS = "https://graph.facebook.com/me/friends?access_token="; 

    private TextView     textInstructionsOrLink; 
    private Button      buttonLoginLogout; 
    private final Session.StatusCallback statusCallback  = new SessionStatusCallback(); 

    @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); 
     textInstructionsOrLink = (TextView) view 
      .findViewById(R.id.instructionsOrLink); 

     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

     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)); 
      } 
     } 

     updateView(); 

     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 updateView() { 
     Session session = Session.getActiveSession(); 
     if (session.isOpened()) { 
      textInstructionsOrLink.setText(URL_PREFIX_FRIENDS 
       + session.getAccessToken()); 
      buttonLoginLogout.setText(R.string.logout); 
      buttonLoginLogout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        onClickLogout(); 
       } 
      }); 

      session.addCallback(new StatusCallback() { 

       @Override 
       public void call(Session session, SessionState state, 
        Exception exception) { 
        List<String> PERMISSIONS = Arrays 
         .asList("publish_actions"); 
        session 
         .requestNewPublishPermissions(new Session.NewPermissionsRequest(
          getActivity(), PERMISSIONS)); 

        Request request = Request.newStatusUpdateRequest(
         session, "getActiveSession", 
         new Request.Callback() { 
          @Override 
          public void onCompleted(Response response) { 
           L.d("fb:done = " 
            + response.getGraphObject() + "," 
            + response.getError()); 
          } 
         }); 
        request.executeAsync(); 

       } 

      }); 


     } else { 
      textInstructionsOrLink.setText(R.string.instructions); 
      buttonLoginLogout.setText(R.string.login); 
      buttonLoginLogout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        onClickLogin(); 
       } 
      }); 
     } 
    } 

    private void onClickLogin() { 
     Session session = Session.getActiveSession(); 
     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(new Session.OpenRequest(this) 
       .setCallback(statusCallback)); 
     } else { 
      Session.openActiveSession(getActivity(), this, true, 
       statusCallback); 
     } 
    } 

    private void onClickLogout() { 
     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) { 
      updateView(); 
     } 
    } 
}