目前我使用最新的sdk来实现facebook登录,但是,它与官方的实际行为略有不同
官方行为:用户点击登录按钮,权限对话框提示,如果我点击取消,它将关闭该框,只有当我点击确认时才会登录
我的应用行为:用户单击登录按钮,如果我单击取消,但如果我再次单击登录按钮,它将不会显示任何权限对话框,并将登录
我从官方样本中复制了代码,所以我很困惑为什么它在我的应用程序中表现不同.怎么解决?谢谢
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 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,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() { public void onClick(View view) { onClicklogout(); } }); } else { textInstructionsOrLink.setText(R.string.instructions); buttonLoginlogout.setText(R.string.login); buttonLoginlogout.setOnClickListener(new View.OnClickListener() { 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(); } } }
我的应用程序(我使用了与官方名称相同的方法名称,我没有为facebook登录添加其他代码)
public class Home extends Fragment implements LoginListener { private final static String TAG = "Home"; public View rootView; public ImageView HomeBg; public ImageView buttonLoginlogout; public TextView chi; public TextView eng; public ColorStateList oldColor; public SharedPreferences prefs; public EasyTracker tracker = null; public SharedPreferences.Editor editor; public ArrayList<String> permission; public ProgressDialog pd; public Home ctx; //Facebook login private Session.StatusCallback statusCallback = new SessionStatusCallback(); @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); ctx = this; } @Override public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { try{ // fix for disable the hiding action bar animation getActivity().getActionBar().getClass().getDeclaredMethod("setShowHideAnimationEnabled",boolean.class).invoke(getActivity().getActionBar(),false); } catch (Exception exception){ // animation will be run if not support } getActivity().getActionBar().hide(); tracker = EasyTracker.getInstance(getActivity()); if (permission == null) { permission = new ArrayList<String>(); permission.add("email"); } prefs = getActivity().getSharedPreferences("userInfo",0); editor = prefs.edit(); rootView = inflater.inflate(R.layout.home,false); buttonLoginlogout = (ImageView) rootView.findViewById(R.id.home_connectFB); eng = (TextView) rootView.findViewById(R.id.btn_eng); chi = (TextView) rootView.findViewById(R.id.btn_chi); eng.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { if (!Utility.getLocale(getActivity()).equals("en")) { tracker.send(MapBuilder.createEvent("menu_click","language","switchEN",null).build()); chi.setTextColor(oldColor); eng.setTextColor(getActivity().getResources().getColor(android.R.color.white)); MyApp.updateLanguage(getActivity().getApplicationContext(),"en"); refreshAfterLocaleChanged("en"); } } }); chi.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { if (!Utility.getLocale(getActivity()).equals("zh")) { tracker.send(MapBuilder.createEvent("menu_click","switchTC",null).build()); eng.setTextColor(oldColor); chi.setTextColor(getActivity().getResources().getColor(android.R.color.white)); MyApp.updateLanguage(getActivity().getApplicationContext(),"zh"); refreshAfterLocaleChanged("zh"); } } }); if (Utility.getLocale(getActivity()).equals("zh")) { chi.setTextColor(getActivity().getResources().getColor( android.R.color.white)); oldColor = eng.getTextColors(); } else { eng.setTextColor(getActivity().getResources().getColor( android.R.color.white)); oldColor = chi.getTextColors(); } //Facebook login Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); Session session = Session.getActiveSession(); if (session == null) { if (savedInstanceState != null) { session = Session.restoreSession(getActivity(),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 rootView; } public void refreshAfterLocaleChanged(String lang){ SharedPreferences langPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); Editor editor = langPrefs.edit(); editor.putString("lang",lang).commit(); Intent intent = getActivity().getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); getActivity().finish(); getActivity().overridePendingTransition(0,0); startActivity(intent); } @Override public void onStart() { super.onStart(); Session.getActiveSession().addCallback(statusCallback); tracker.set(Fields.SCREEN_NAME,"hk7app/CX/" + Utility.getLocale(getActivity()) + "/Landing Page"); tracker.send(MapBuilder.createAppView().build()); } @Override public void onStop() { super.onStop(); if (pd != null) pd.dismiss(); Session.getActiveSession().removeCallback(statusCallback); EasyTracker.getInstance(getActivity()).activityStop(getActivity()); } @SuppressWarnings("deprecation") private void updateView() { Session session = Session.getActiveSession(); if (session.isOpened()) { final String token = session.getAccessToken(); Request.executeMeRequestAsync(session,new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user,Response response) { // TODO Auto-generated method stub if (user != null) { if (!user.getId().equals(prefs.getString("fbId",""))) { editor.putString("fbId",user.getId()); editor.putString("fName",user.getFirstName()); editor.putString("lName",user.getLastName()); editor.putString("email",user.asMap().get("email").toString()); editor.commit(); } if (prefs.getString("memId","").equals("") || prefs.getString("token","").equals("") || !user.getId().equals(prefs.getString("fbId",""))){ pd = ProgressDialog.show(getActivity(),getActivity().getResources().getString(R.string.sys_info),getActivity().getResources().getString(R.string.loading)); new APIHandler(getActivity(),tracker,"login",pd).execute(ctx,token); } else { onLoginComplete("",""); } } } }); } else { buttonLoginlogout.setImageResource(R.drawable.landing_btn_connect_facebook); buttonLoginlogout.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { onClickLogin(); } }); } } @Override public void onActivityResult(int requestCode,outState); } private void onClickLogin() { tracker.send(MapBuilder.createEvent("menu_click","Fbconnect","connectFB_" + Utility.getLocale(getActivity()),null).build()); Session session = Session.getActiveSession(); if (!session.isOpened() && !session.isClosed()) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); } else { Session.openActiveSession(getActivity(),statusCallback); } } private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session,Exception exception) { Log.d(TAG,"SessionStatusCallback"); if (exception != null) { Log.d(TAG,""+exception); if (!session.isClosed()) session.closeAndClearTokenInformation(); //reset session if (exception instanceof FacebookAuthorizationException){ new AlertDialog.Builder(getActivity()) .setTitle(ctx.getResources().getString(R.string.sys_info)) .setMessage(R.string.facebook_permission_missing) .setPositiveButton(ctx.getResources().getString(R.string.close),null) .show(); } } else { updateView(); } } } @Override public void onResume() { super.onResume(); AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id)); } @Override public void onLoginComplete(String memberId,String token) { if (pd != null) pd.dismiss(); if (!memberId.equals("") && !token.equals("")) { editor.putString("memId",memberId); editor.putString("token",token); editor.commit(); } buttonLoginlogout.setImageResource(R.drawable.landing_btn_take_a_selfie); buttonLoginlogout.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { tracker.send(MapBuilder.createEvent("menu_click","TakeSelfie","Selfie_now_" + Utility.getLocale(getActivity()),null).build()); ((LandingPage)getActivity()).tabHost.setCurrentTab(2); } }); } @Override public void onLoginFailure(String errorMsg) { if (pd != null) pd.dismiss(); Toast.makeText(getActivity(),errorMsg,Toast.LENGTH_LONG).show(); } }
解决方法
试试这段代码:
public class FbActivity extends FragmentActivity { private static final String PERMISSION = "publish_actions"; private final String PENDING_ACTION_BUNDLE_KEY = "com.facebook.samples.hellofacebook:PendingAction"; private LoginButton loginButton; private ProfilePictureView profilePictureView; private TextView greeting; private PendingAction pendingAction = PendingAction.NONE; private ViewGroup controlsContainer; private GraphUser user; private GraPHPlace place; private List<GraphUser> tags; private boolean canPresentShareDialog; private UiLifecycleHelper uiHelper; private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session,Exception exception) { onSessionStateChange(session,state,exception); } }; private FacebookDialog.Callback dialogCallback = new FacebookDialog.Callback() { @Override public void onError(FacebookDialog.PendingCall pendingCall,Exception error,Bundle data) { Log.d("HelloFacebook",String.format("Error: %s",error.toString())); } @Override public void onComplete(FacebookDialog.PendingCall pendingCall,"Success!"); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); uiHelper = new UiLifecycleHelper(this,callback); uiHelper.onCreate(savedInstanceState); if (savedInstanceState != null) { String name = savedInstanceState .getString(PENDING_ACTION_BUNDLE_KEY); pendingAction = PendingAction.valueOf(name); } setContentView(R.layout.activity_fb); loginButton = (LoginButton) findViewById(R.id.login_button); loginButton .setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() { @Override public void onUserInfoFetched(GraphUser user) { FbActivity.this.user = user; onClickPostPhoto(); updateUI(); // It's possible that we were waiting for this.user to // be populated in order to post a // status update. handlePendingAction(); } }); profilePictureView = (ProfilePictureView) findViewById(R.id.profilePicture); greeting = (TextView) findViewById(R.id.greeting); controlsContainer = (ViewGroup) findViewById(R.id.main_ui_container); final FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragment_container); if (fragment != null) { // If we're being re-created and have a fragment,we need to a) hide // the main UI controls and // b) hook up its listeners again. controlsContainer.setVisibility(View.GONE); } // Listen for changes in the back stack so we know if a fragment got // popped off because the user // clicked the back button. fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { if (fm.getBackStackEntryCount() == 0) { // We need to re-show our UI. controlsContainer.setVisibility(View.VISIBLE); } } }); canPresentShareDialog = FacebookDialog.canPresentShareDialog(this,FacebookDialog.ShareDialogFeature.SHARE_DIALOG); } @Override protected void onResume() { super.onResume(); uiHelper.onResume(); // Call the 'activateApp' method to log an app event for use in // analytics and advertising reporting. Do so in // the onResume methods of the primary Activities that an app may be // launched into. AppEventsLogger.activateApp(this); updateUI(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); uiHelper.onSaveInstanceState(outState); outState.putString(PENDING_ACTION_BUNDLE_KEY,pendingAction.name()); } @Override protected void onActivityResult(int requestCode,Intent data) { super.onActivityResult(requestCode,data); uiHelper.onActivityResult(requestCode,data,dialogCallback); } @Override public void onPause() { super.onPause(); uiHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } private void onSessionStateChange(Session session,Exception exception) { if (pendingAction != PendingAction.NONE && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) { new AlertDialog.Builder(FbActivity.this) .setTitle(R.string.cancelled) .setMessage(R.string.permission_not_granted) .setPositiveButton(R.string.ok,null).show(); pendingAction = PendingAction.NONE; } else if (state == SessionState.OPENED_TOKEN_UPDATED) { handlePendingAction(); } updateUI(); } private void updateUI() { Session session = Session.getActiveSession(); boolean enableButtons = (session != null && session.isOpened()); if (enableButtons && user != null) { profilePictureView.setProfileId(user.getId()); greeting.setText(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; // pendingAction = PendingAction.POST_PHOTO; } private interface GraphObjectWithId extends GraphObject { String getId(); } }