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

He seguido algunos tutoriales de API de Facebook 3.0, incluidos los ejemplos Login / Logout y Publicar para alimentar. Así que el login funciona de esta manera:

  1. Se abre la aplicación, muestra un fragmento que muestra un botón de inicio de sesión
  2. El usuario hace clic en Inicio de sesión, la autenticación se realiza a través de la biblioteca FacebookSDK (com.facebook.widget.LoginActivity) y el código proporcionado mediante sesiones.
  3. El usuario es redirigido a la siguiente pantalla

No quiero que el usuario ingrese de esta manera. Quiero que usen mi aplicación sin ningún inicio de sesión / registro, luego si hacen clic en una característica específica de Facebook, por ejemplo, comparten una nota en Facebook, entonces la aplicación debe preguntarles si dejan que Facebook use su aplicación o algo, . Sin esto consigo un nullpointer en la función de publishFeedDialog () como la sesión es null, porque no se ha hecho la conexión.

Así que mi pregunta es, ¿cómo puedo ignorar el SplashFragment con el botón de inicio de sesión, por lo que cuando el usuario hace clic en una función de Facebook en mi aplicación, no se muestra ninguna nueva pantalla con un botón de inicio de sesión, sino sólo la ventana de autenticación de Facebook predeterminada que los usuarios utilizan ¿a?

@erdomester, @sromku

Facebook lanza la nueva versión 4.x de sdk donde Session está obsoleta,

Hay un nuevo concepto de inicio de sesión desde facebook

LoginManager y AccessToken – Estas nuevas clases realizan Facebook Login

Por lo tanto, 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á (correctamente señalado 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; } } 

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

Esta sencilla biblioteca puede ayudarle: https://github.com/sromku/android-simple-facebook

Simplemente agregue esta biblioteca a su proyecto y haga la referencia de esta biblioteca a Facebook SDK 3.0.x y añada referencia de su aplicación a esta biblioteca.

A continuación, puede iniciar sesión sin el LoginButton y realizar acciones sencillas 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); 

A continuación, 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.

Un Turnaroubd para acceder a los detalles del FB sin usar LoginButton es

1) Ocultar su interfaz de usuario de inicio de sesión

2) Añada su botón de encargo

 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 utilizar LoginManager

  • La devolución de llamada de inicio de sesión no se activa mediante facebook-android-sdk 4
  • No se puede reloginar con las credenciales de Facebook después de cerrar la sesión
  • Ocultar barra de estado durante el diálogo de inicio de sesión de Facebook
  • No se puede publicar una imagen de drawable a facebook
  • Preguntas sobre el patrón MVP para aplicaciones de Android
  • Aplicación para Android Facebook SDK 4.0 sin Facebook
  • Android SDK de Facebook v3.0 SSO LoginButton devolver un nulo GraphUser
  • Cómo obtener APP_ID para Facebook?
  • Cómo funciona el cierre de sesión en Facebook SDK Android
  • Solicitando un permiso de Facebook rechazado de nuevo sin aparecer el diálogo de Facebook dos veces
  • El inicio de sesión de Android facebook no funciona con la aplicación de Facebook instalada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.