Intereting Posts
TextView – эллипсис и сломанные символы Recyclerview addOnItemTouchListener получает whosubview, щелкнув внутри строки Отправлять приложение с базой данных Как выполнить поиск с помощью клавиши ввода на пользовательском интерфейсе AndroidMododService? Android, как запросить огромную базу данных в android (размер курсора ограничен 1 МБ) Arm-linux-androideabi-gcc не может создать исполняемый файл – компиляция ffmpeg для устройств android armeabi Как остановить Open GL renderer Android: чтение XML из локального ресурса (для тестирования) Для чего используются флаги защиты «appop» и «development»? Android Studio – удалить модуль – IncorrectOperationException: не следует изменять внешнюю команду документа или отменять прозрачность Android: дочерний процесс (logcat) продолжает работать после того, как родительский процесс (приложение) умер Как слушать изменения в базе данных контактов Как стирать краску пальцем Эта зависимость дает мне две версии одной банки. Как это исправить? Отключить ландшафтный режим для всего приложения

Обработка сеанса входа в facebook sdk в android

В настоящее время я использую новейший sdk для реализации входа в facebook, однако он немного отличается от фактического поведения официального

Официальное поведение: пользователь нажимает кнопку входа в систему, диалоговое окно разрешения, если я нажму «отменить», он закроет окно, он войдет в систему только после нажатия кнопки «подтвердить»

Мое поведение приложения: пользователь нажимает кнопку входа в систему, диалоговое окно разрешения, если я нажму «отменить», он закроет окно, но если я снова нажму кнопку входа в систему, он не отобразит диалоговое окно разрешения и не войдет в систему

Я скопировал код из официального образца, поэтому я смущен, почему он ведет себя по-другому в моем приложении. Как это исправить? благодаря

Пример 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, 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() { 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, ViewGroup container, 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, container, 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","language", "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(), 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 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, 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 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(), this, true, statusCallback); } } private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session, SessionState state, 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(); } } 

Solutions Collecting From Web of "Обработка сеанса входа в facebook sdk в android"

Попробуйте этот код:

 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, SessionState state, 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, Bundle data) { Log.d("HelloFacebook", "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, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data, dialogCallback); } @Override public void onPause() { super.onPause(); uiHelper.onPause(); } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } private void onSessionStateChange(Session session, SessionState state, 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(); } }