android - seguridad - Autenticación de Facebook sin botón de inicio de sesión
quiero saber mi codigo de facebook (6)
@erdomester, @sromku
Facebook lanza una nueva versión de SDK 4.x donde la sesión está en desuso
Existe un nuevo concepto de inicio de sesión desde Facebook
LoginManager y AccessToken : estas nuevas clases realizan Facebook Login
Entonces, ahora puede acceder a la autenticación de Facebook sin el botón de inicio de sesión como
layout.xml
<Button
android:id="@+id/btn_fb_login"
.../>
MainActivity.java
private CallbackManager mCallbackManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
mCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(mCallbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d("Success", "Login");
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "Login Cancel", Toast.LENGTH_LONG).show();
}
@Override
public void onError(FacebookException exception) {
Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
}
});
setContentView(R.layout.activity_main);
Button btn_fb_login = (Button)findViewById(R.id.btn_fb_login);
btn_fb_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
}
});
}
Editar
Si no agrega lo siguiente, no funcionará (señalado con acierto por @Daniel Zolnai en el comentario a continuación):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
return;
}
}
He seguido algunos tutoriales de Facebook API 3.0, incluidos los ejemplos de Inicio de sesión / Cierre de sesión y Publicar para alimentar. Entonces, el inicio de sesión funciona de esta manera:
- La aplicación se abre, muestra un fragmento que muestra un botón de inicio de sesión
- El usuario hace clic en iniciar sesión, la autenticación se realiza a través de la biblioteca FacebookSDK referenciada (com.facebook.widget.LoginActivity) y el código provisto mediante sesiones.
- El usuario es redirigido a la pantalla siguiente
No quiero que el usuario inicie sesión de esta manera. Quiero que usen mi aplicación sin ningún inicio de sesión / registro, luego, si hacen clic en una función específica de Facebook, por ejemplo, compartir una nota en Facebook, la aplicación debería preguntarles si permiten que Facebook use su aplicación o algo, ya sabes lo que se suele hacer. . Sin esto obtengo un nullpointer en la función publishFeedDialog () ya que la sesión es nula, porque no se ha iniciado sesión.
Así que mi pregunta es cómo puedo ignorar el SplashFragment con el botón Iniciar sesión, así que cuando el usuario hace clic en una función de Facebook en mi aplicación, no aparece ninguna pantalla nueva con un botón de inicio de sesión, sino solo la ventana predeterminada de autenticación de Facebook que usan los usuarios ¿a?
Algo como esto
private void performFacebookLogin()
{
Log.d("FACEBOOK", "performFacebookLogin");
final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, Arrays.asList("email"));
Session openActiveSession = Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
Log.d("FACEBOOK", "call");
if (session.isOpened() && !isFetching)
{
Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
isFetching = true;
session.requestNewReadPermissions(newPermissionsRequest);
Request getMe = Request.newMeRequest(session, new GraphUserCallback()
{
@Override
public void onCompleted(GraphUser user, Response response)
{
Log.d("FACEBOOK", "onCompleted");
if (user != null)
{
Log.d("FACEBOOK", "user != null");
org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
String email = graphResponse.optString("email");
String id = graphResponse.optString("id");
String facebookName = user.getUsername();
if (email == null || email.length() < 0)
{
Logic.showAlert(
ActivityLogin.this,
"Facebook Login",
"An email address is required for your account, we could not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.");
return;
}
}
}
});
getMe.executeAsync();
}
else
{
if (!session.isOpened())
Log.d("FACEBOOK", "!session.isOpened()");
else
Log.d("FACEBOOK", "isFetching");
}
}
});
En realidad exactamente así. Funciona perfectamente bien para mí.
Esta sencilla biblioteca puede ayudarlo: https://github.com/sromku/android-simple-facebook
Simplemente agregue esta biblioteca a su proyecto y haga la referencia desde esta biblioteca a Facebook SDK 3.0.xy añada una referencia desde su aplicación a esta biblioteca.
Luego puede iniciar sesión sin el LoginButton
y realizar acciones simples como publicar feeds, obtener perfil / amigos, enviar invitaciones y más.
Así es como se ve el inicio de sesión:
OnLoginOutListener onLoginOutListener = new SimpleFacebook.OnLoginOutListener()
{
@Override
public void onFail()
{
Log.w(TAG, "Failed to login");
}
@Override
public void onException(Throwable throwable)
{
Log.e(TAG, "Bad thing happened", throwable);
}
@Override
public void onThinking()
{
// show progress bar or something to the user while login is happening
Log.i(TAG, "In progress");
}
@Override
public void onLogout()
{
// change the state of the button or do whatever you want
Log.i(TAG, "Logged out");
}
@Override
public void onLogin()
{
// change the state of the button or do whatever you want
Log.i(TAG, "Logged in");
}
};
// set login/logut listener
mSimpleFacebook.setLogInOutListener(onLoginOutListener);
// do the login action
mSimpleFacebook.login(MainActivity.this);
Luego, en el método de devolución de llamada onLogin()
puede publicar un feed como este:
// build feed
Feed feed = new Feed.Builder()
.setMessage("Clone it out...")
.setName("Simple Facebook for Android")
.setCaption("Code less, do the same.")
.setDescription("The Simple Facebook library project makes the life much easier by coding less code for being able to login, publish feeds and open graph stories, invite friends and more.")
.setPicture("https://raw.github.com/sromku/android-simple-facebook/master/Refs/android_facebook_sdk_logo.png")
.setLink("https://github.com/sromku/android-simple-facebook")
.build();
// publish the feed
mSimpleFacebook.publish(feed);
Espero que te ayude.
Esto funcionó para mí
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.TextView;
import com.facebook.*;
import com.facebook.model.*;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request.newMeRequest(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("Hello " + user.getName() + "!");
}
}
}).executeAsync();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
}
si necesita obtener autorizaciones después de verificar que la sesión está abierta, agregue de esta manera:
List<String> permissions = session.getPermissions();
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
session.requestNewReadPermissions(newPermissionsRequest);
Puede omitir el cuadro de diálogo de inicio de sesión utilizando el módulo facebook-proxy potenciado por Nodo. Crea tu propia instancia en Heroku usando el botón de despliegue con un solo clic.
Lo que hace básicamente:
- Solicita
access_token
desde Facebook - Abre un servidor proxy usando
express-http-proxy
- Vamos a solicitar todos los puntos finales de la API
Un Turnaroubd para acceder a los detalles de FB sin usar LoginButton es
1) Ocultar su interfaz de usuario de LoginButton
2) Agregue su botón personalizado
Button signup = (Button) view.findViewById(R.id.btn_signup);
signup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.performClick();//Where loginButton is Facebook UI
}
});
Pero sugiero usar LoginManager