tutorial - Botón de inicio de sesión personalizado de Facebook-Android
iniciar sesion con facebook api (7)
Estoy siguiendo este Tutorial pero hasta ahora no puedo hacer que funcione, aunque esto es de hace un año más o menos ...
Estoy usando androidStudo 1.2.2 y FacebookSDK 4.
Quiero un inicio de sesión simple en Facebook con un botón personalizado, como el que se muestra en esta imagen:
Ahora, en el ejemplo del tutorial, tengo problemas con la variable
Session
, dice que no puede resolverla, ni
getActivity()
¿Nadie ha intentado esto en FacebookSDK4.0?
¿Es un enfoque correcto o tal vez hay algo más actualizado?
¡Gracias por adelantado!
La respuesta simple es agregar
facebookButton.performClick()
dentro de
cutomBtn.setOnClickListener
<!-- connect with Facebook -->
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.facebook.login.widget.LoginButton
android:id="@+id/fb_connect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:textSize="@dimen/login_fb_font_size"
android:visibility="invisible" />
<LinearLayout
android:id="@+id/mfb_connect"
style="@style/facebook_button">
<ImageView
style="@style/login_connect_icon"
android:src="@drawable/ic_facebook" />
<TextView
style="@style/login_connect_text"
android:text="@string/login_connect_facebook" />
</LinearLayout>
</RelativeLayout>
...
private LoginButton fb_connect;
private LinearLayout mfb_connect;
...
// the button from facebook sdk
fb_connect = (LoginButton) findViewById(R.id.fb_connect);
// handle the click from my custom button to perfrom action click on facebook sdk button
mfb_connect = (LinearLayout) findViewById(R.id.mfb_connect);
mfb_connect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fb_connect.performClick();
}
});
Eso logrará esto:
(no tengo suficiente reputación para agregar un comentario ...)
Intenté la respuesta de @ Shehabix, no puedo recibir la devolución de llamada hasta que agregue esto
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
entonces funciona bien.
Complementando las respuestas de Harvi y Shehabix, sugeriría agregar este método ya que esto registra la autenticación en Firebase Auth.
Este método debe llamarse dentro de "En caso de éxito" de
LoginManager
.
private void handleFacebookAccessToken(AccessToken token) {
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Toast.makeText(MainActivity.this, "Autenticando",Toast.LENGTH_SHORT).show();
} else {
// If sign in fails, display a message to the user.
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
//updateUI(null);
}
}
});
}
Esto es muy simple. Agregue un botón en el archivo de diseño como
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Login with facebook"
android:textColor="#ffff"
android:layout_gravity="center"
android:textStyle="bold"
android:onClick="fbLogin"
android:background="@color/colorPrimary"/>
Y en el lugar onClick, el método registercallback () de LoginManager se debe a que este método se ejecuta automáticamente.
me gusta:
public void fbLogin(View view)
{
// Before Edit:
// LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts" , "AccessToken"));
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts"));
LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList("publish_actions"));
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>()
{
@Override
public void onSuccess(LoginResult loginResult)
{
// App code
}
@Override
public void onCancel()
{
// App code
}
@Override
public void onError(FacebookException exception)
{
// App code
}
});
}
Que te diviertas
La parte IMO de la respuesta seleccionada es una solución alternativa, no es la solución adecuada. Entonces, lo que debe cambiarse para que sea adecuado es lo siguiente:
-
Deshágase de "com.facebook.login.widget.LoginButton" de su XML
<com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" />
-
Deshágase de todas las referencias al "LoginButton" en su código Java
-
Use la clase "LoginManager" de Facebook que está ahí para ese propósito de la siguiente manera:
@Override protected void onCreate(Bundle savedInstanceState) { // Some code callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback( callbackManager, new FacebookCallback < LoginResult > () { @Override public void onSuccess(LoginResult loginResult) { // Handle success } @Override public void onCancel() { } @Override public void onError(FacebookException exception) { } } ); } public void onClick(View v) { if (v == fb) { LoginManager.getInstance().logInWithReadPermissions( this, Arrays.asList("user_photos", "email", "user_birthday", "public_profile") ); } } // this part was missing thanks to wesely @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); }
Paso 1:
Primero agregue FrameLayout y haga que el botón de Facebook sea visibilidad = "desaparecido" y agregue su botón personalizado.
No olvide poner
xmlns:facebook="http://schemas.android.com/apk/res-auto"
en su diseño principal.
<FrameLayout
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<com.facebook.login.widget.LoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<Button
android:id="@+id/fb"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#416BC1"
android:onClick="onClick"
android:text="FaceBook"
android:textColor="#ffffff"
android:textStyle="bold" />
</FrameLayout>
Paso 2:
Inicialice
FacebookSdk
en
onCreate
antes de
onCreate
diseño.
FacebookSdk.sdkInitialize (this.getApplicationContext ());
Paso 3: agregue esto a su archivo java.
callbackManager = CallbackManager.Factory.create();
fb = (Button) findViewById(R.id.fb);
loginButton = (LoginButton) findViewById(R.id.login_button);
List < String > permissionNeeds = Arrays.asList("user_photos", "email",
"user_birthday", "public_profile", "AccessToken");
loginButton.registerCallback(callbackManager,
new FacebookCallback < LoginResult > () {@Override
public void onSuccess(LoginResult loginResult) {
System.out.println("onSuccess");
String accessToken = loginResult.getAccessToken()
.getToken();
Log.i("accessToken", accessToken);
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {@Override
public void onCompleted(JSONObject object,
GraphResponse response) {
Log.i("LoginActivity",
response.toString());
try {
id = object.getString("id");
try {
URL profile_pic = new URL(
"http://graph.facebook.com/" + id + "/picture?type=large");
Log.i("profile_pic",
profile_pic + "");
} catch (MalformedURLException e) {
e.printStackTrace();
}
name = object.getString("name");
email = object.getString("email");
gender = object.getString("gender");
birthday = object.getString("birthday");
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields",
"id,name,email,gender, birthday");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
System.out.println("onCancel");
}
@Override
public void onError(FacebookException exception) {
System.out.println("onError");
Log.v("LoginActivity", exception.getCause().toString());
}
});
Paso 4: No olvides agregar el siguiente código.
@Override
protected void onActivityResult(int requestCode, int responseCode,
Intent data) {
super.onActivityResult(requestCode, responseCode, data);
callbackManager.onActivityResult(requestCode, responseCode, data);
}
Paso 5: Configure su clic de botón personalizado en Facebook Haga clic en el botón Iniciar sesión.
public void onClick(View v) {
if (v == fb) {
loginButton.performClick();
}
}
Paso 6: para cerrar sesión mediante programación, use esto.
LoginManager.getInstance (). LogOut ();
Paso 7: puede encontrar usuarios conectados o no por perfil.
profile = Profile.getCurrentProfile().getCurrentProfile();
if (profile != null) {
// user has logged in
} else {
// user has not logged in
}
try this // Facebook Button LoginButton loginButton = findViewById(R.id.loginbtn); // Your Custom Button binding.fbBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loginButton.callOnClick(); } });