sesion seguridad saber recuperacion quiero pasos inicio impresos factor error doble codigos codigo autenticación autenticacion aprobar android facebook facebook-android-sdk

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:

  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í.


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:

  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

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