Autenticación de Facebook sin botón de inicio de sesión

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:

  1. La aplicación se abre, muestra un fragmento que muestra un botón de inicio de sesión
  2. 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.
  3. 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í.

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 permissions = session.getPermissions(); Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox")); session.requestNewReadPermissions(newPermissionsRequest); 

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 callback 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("http://sofes.miximages.com/android/android_facebook_sdk_logo.png") .setLink("https://github.com/sromku/android-simple-facebook") .build(); // publish the feed mSimpleFacebook.publish(feed); 

Espero que te ayude.

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

Puede omitir el cuadro de diálogo de inicio de sesión utilizando el módulo proxy de facebook potenciado por Nodo. Crea tu propia instancia en Heroku usando el botón de despliegue con un solo clic.

Lo que hace básicamente:

  1. Solicita access_token desde Facebook
  2. Abre un servidor proxy usando express-http-proxy
  3. Vamos a solicitar todos los puntos finales de la API