Identificar el botón de inicio de sesión de Facebook SDK 3 en el clic
Estoy utilizando el componente com.facebook.widget.LoginButton
para iniciar sesión en Facebook:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.splash, container, false); LoginButton authButton = (LoginButton) view.findViewById(R.id.login_button); stat = (TextView) view.findViewById(R.id.profile_name); //authButton.setFragment(this); authButton.setReadPermissions(Arrays.asList("user_likes", "user_status", "user_status", "user_events", "friends_events")); return view; }
Quiero pedirle al usuario su estado de inicio de sesión, así que necesito cambiar una vista de texto cuando el botón de Facebook fue presionado.
- Iniciar sesión con permiso adicional con Facebook SDK 3 para Android
- Autenticación de Facebook para el servicio JSON con la aplicación Android
- ¿Cuándo solicitar permisos con el nuevo Android SDK 3.0 de Facebook?
- SDK de Android Facebook: errores al importar SDK
- Android: Facebook obtiene "Token de acceso de usuario", al acceder con éxito
Pero no puedo encontrar una manera de identificar el clic del usuario, sin cambiar la lib de Facebook, ni sobreescribir el LoginButton
nativo de LoginButton
.
- Session.openActiveSession sólo llama OPENING en Facebook SDK de Android
- Recursos $ NotFoundException se lanza integrando Facebook-android-sdk-3.0
- No se puede acceder a amigos de Facebook mediante la aplicación de Android
- Facebook android sdk 3.0 SSO
- Recuperar foto de perfil con Facebook SDK 3.0 para Android
- Android SDK de Facebook v3.0 SSO LoginButton devolver un nulo GraphUser
- Cómo utilizar Facebook SDK con android.app.Fragment
- ¿De dónde viene este error? Error: com.facebook.FacebookException: Error al obtener el nombre de la aplicación
Me he encontrado con el mismo problema al intentar implementar una lib de inicio de sesión para mi aplicación. Hasta ahora la solución que encontré, aún no estoy seguro de si es mejor o no, estaba cambiando la clase LoginClickListener dentro de facebook-sdk de privado a público , así que podría anular el método onClick en mi Actividad. Aquí está la línea que he cambiado.
De:
private class LoginClickListener implements OnClickListener { @Override public void onClick(View v) { ...
A:
public class LoginClickListener implements OnClickListener { @Override public void onClick(View v) { ...
Entonces en mi actividad soy capaz de sobrescribir método onClick.
LoginButton facebookButton = (LoginButton) findViewById(R.id.authButton); facebookButton.setOnClickListener( facebookButton.new LoginClickListener(){ @Override public void onClick(View v) { //Do whatever u want super.onClick(v); } });
Buena suerte.
En lugar de intentar anular el método onclick
o cambiar la lib de Facebook. puede utilizar SessionState
para detectar si se ha hecho clic en el botón de loginButton
. Cuando el SessionState
es OPENING, significa que se ha hecho clic en el botón
private Session.StatusCallback fBcallback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { Session fbSession = session; Log.e(this.getClass().getName(), "fbSession isNULL " + (fbSession == null)); Log.e(this.getClass().getName(), "fbSession state:" + fbSession.getState() + ""); switch (fbSession.getState()) { case CLOSED: Log.e(this.getClass().getName(), "CLOSED"); break; case CLOSED_LOGIN_FAILED: Log.e(this.getClass().getName(), "CLOSED LOGIN FAILED"); authButton.setVisibility(View.VISIBLE); rl.setVisibility(View.GONE); break; case CREATED: Log.e(this.getClass().getName(), "CREATED"); break; case CREATED_TOKEN_LOADED: Log.e(this.getClass().getName(), "CREATED TOKEN LOADED"); break; case OPENED: Log.e(this.getClass().getName(), "OPENED"); break; case OPENED_TOKEN_UPDATED: Log.e(this.getClass().getName(), "OPENED TOKEN UPDATED"); break; case OPENING: Log.e(this.getClass().getName(), "OPENING"); authButton.setVisibility(View.GONE); rl.setVisibility(View.VISIBLE); break; } if (fbSession.isOpened()) { Log.e(this.getClass().getName(), "fbSession is opened"); getFBUserData(); } if (fbSession.isClosed()) { Log.e(this.getClass().getName(), "fbSession is closed, logout"); Token.removeToken(mActivity); } } };
Mira en el HelloFacebookSample
. Están haciendo algo como esto allí.
loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() { @Override public void onUserInfoFetched(GraphUser user) { updateUI(user); } });
entonces en el método updateUI()
private void updateUI(GraphUser user) { Session session = Session.getActiveSession(); if (session != null && session.isOpened() && user != null) { mTextView.setText(user.getFirstName()); } }
Si está cuidando la sesión de conexión (consulte la muestra para obtener detalles), el estado de inicio de sesión del usuario se mantendrá incluso cuando salga de la aplicación.
En lugar de sobrecargar el LoginButton, acabo de utilizar el fondo de la imagen. Si bien el texto no se alinea perfectamente de forma predeterminada, jugar con los márgenes puede ayudar.
Button fbBtn = (Button)findViewById(R.id.fbLogin) ; if( fbBtn != null ) { fbBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.com_facebook_loginbutton_blue) ) ; fbBtn.setText( R.string.prompt_login_yes ) ; fbBtn.setTextColor( getResources().getColor(R.color.com_facebook_loginview_text_color) ) ; fbBtn.setTextSize( 16 ) ; fbBtn.setVisibility(View.VISIBLE) ; }
- "No se puede resolver el símbolo` Request` 'error para facebook Graph API
- Obtener linearLayout desde otro xml Android