我有一个按钮点击登录Facebook,但有时这个代码无法工作.抛出异常:造成:
com.facebook.FacebookException: Cannot pass a publish or manage permission (email) to a request for read authorization
这是我的活动代码:
public class FacebookLoginActivity extends Activity { private final static String TAG="FB"; private static final List<String> PERMISSIONS=Arrays.asList("email","user_likes","user_status"); private Session.StatusCallback statusCallback=new SessionStatusCallback(); private GraphUser user = null; private Bundle bundle; private Intent myIntent; private Session session; private static FacebookLoginActivity instance=new FacebookLoginActivity(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(bundle==null){ bundle=new Bundle(); } Log.v(TAG,"in FB onCreate method"); myIntent = this.getIntent(); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); String action = ClientUtil.getElementValue("action"); Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); session=openActiveSession(this,true,PERMISSIONS); onClickLogin(); } public void onClickLogin() { Log.v(TAG,"click login btn"); session = Session.getActiveSession(); if (!session.isOpened() && !session.isClosed()) { OpenRequest openRequest=new Session.OpenRequest(this); openRequest.setPermissions(PERMISSIONS); openRequest.setCallback(statusCallback); openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS); openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); session.openForPublish(openRequest); } else { Log.v(TAG,"open active session"); Session.openActiveSession(this,statusCallback); } } @Override public void onStart() { super.onStart(); Log.v(TAG,"onStart method to add fb Callback"); Session.getActiveSession().addCallback(statusCallback); } @Override public void onStop() { super.onStop(); Log.v(TAG,"onStop method to remove fb callback"); Session.getActiveSession().removeCallback(statusCallback); } @Override public void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); Log.v(TAG,"onActivityResult method to call Fb Session"); Session.getActiveSession().onActivityResult(this,requestCode,data); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Session session=Session.getActiveSession(); Session.saveSession(session,outState); } private static Session openActiveSession(Activity activity,boolean allowLoginUI,List<String> permissions) { OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions); Session session = new Session.Builder(activity).build(); if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) { Session.setActiveSession(session); session.openForPublish(openRequest); return session; } return null; } private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session,SessionState state,Exception exception) { Log.v(TAG,"in StatusCallback call method exception is:"+ exception); Log.v(TAG,"session state is:"+session.isOpened()); if(user != null) { Log.v(TAG,"fb user is exist todo login yyy"); login(); finish(); Log.v(TAG,"finish fb activity"); return; } if(session.isOpened()) { Log.v(TAG,"session is opened to call FB Request"); Request.executeMeRequestAsync(session,new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser me,Response response) { Log.v(TAG,"in GraphUserCallback onCompleted method"); Log.v(TAG,"GraphUser has value:"+(user!=null)); if(me != null) { user=me; login(); } finish(); Log.v(TAG,"finish fb activity"); } }); }else{ Log.v(TAG,"session is not open"); if(exception !=null && exception.toString().contains("Canceled")){ Log.v(TAG,"cancle login"); bundle.putInt("code",RespondCode.CANCLE); myIntent.putExtras(bundle); setResult(Activity.RESULT_OK,myIntent); finish(); } } } } }