Usar el inicio de sesión de Facebook correctamente

En mi aplicación en la página de inicio le pido al usuario autenticarse a través de Facebook, entonces solicito algunos permisos y buscar alguna información:

LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); authButton.setFragment(this); authButton.setReadPermissions(Arrays.asList("user_likes", "user_status")); fb = new FacebookMain(); 

Soy capaz de obtener toda esta información, pero al pasar a mi siguiente página quiero dar un botón en mi listview y desde allí un usuario puede publicar en una pared de amigos. He seguido el ejemplo de HelloFacebook y funciona como un encanto, sin embargo en mi caso cuando intento implementarlo en un fragmento no funciona como estaba previsto, no quiero que el usuario ingrese cada vez que quiera publicar (estoy usando un permiso adicional aquí – para publicar) ¿Tengo que implementar todos los eventos lifecycly aquí, en este fragmento? ¿Hay algún otro enfoque o recomendación para esto?

Actualmente lo que estoy haciendo es:

mi declaración de clase:

 public class FragmentTab1 extends Fragment { 

Variables de nivel de clase:

 String FACEBOOK_ID; String IMAGE_CONTENT; EditText SEARCH; private static final String PERMISSION = "publish_actions"; Session session; private final String PENDING_ACTION_BUNDLE_KEY = "com.exa.digitalrem:PendingAction"; private PendingAction pendingAction = PendingAction.NONE; private GraphUser user1; private UiLifecycleHelper uiHelper; 

Funciones relacionadas con facebook:

 private PendingAction pendingAction = PendingAction.NONE; private GraphUser user1; private enum PendingAction { NONE, POST_PHOTO, POST_STATUS_UPDATE } private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; public static boolean isActive() { Session session = Session.getActiveSession(); if (session == null) { return false; } return session.isOpened(); } private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (pendingAction != PendingAction.NONE && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) { new AlertDialog.Builder(getActivity()) .setTitle("cancelled").setMessage("NotGranted").setPositiveButton("Ok", null).show(); pendingAction = PendingAction.NONE; } else if (state == SessionState.OPENED_TOKEN_UPDATED) { handlePendingAction(); } updateUI(); } private void updateUI() { Session session = Session.getActiveSession(); boolean enableButtons = (session != null && session.isOpened()); if (enableButtons && user1 != null) { // profilePictureView.setProfileId(user.getId()); // greeting.setText(getString(R.string.app_name, user.getFirstName())); } else { // profilePictureView.setProfileId(null); // greeting.setText(null); } } @SuppressWarnings("incomplete-switch") private void handlePendingAction() { PendingAction previouslyPendingAction = pendingAction; // These actions may re-set pendingAction if they are still pending, but // we assume they // will succeed. pendingAction = PendingAction.NONE; } 

En la onCreate:

  uiHelper = new UiLifecycleHelper(getActivity(), callback); uiHelper.onCreate(savedInstanceState); if (savedInstanceState != null) { name = savedInstanceState.getString(PENDING_ACTION_BUNDLE_KEY); pendingAction = PendingAction.valueOf(name); } //=============================================== Session.openActiveSessionFromCache(getActivity()); //================================================ 

Éste es mi método del poste del facebook, yo llamo esto en un tecleo del botón, que está en un listview:

 public void postFB(String id) { System.out.println("in fb"); if (isNetworkConnected()) { Session session = Session.getActiveSession(); if (session != null) { System.out.println("session not null"); if (hasPublishPermission()) { //do something WebDialog feedDialog = (new WebDialog.FeedDialogBuilder( getActivity(), Session.openActiveSessionFromCache(getActivity()), params)).setOnCompleteListener( new OnCompleteListener() { @Override public void onComplete(Bundle values, FacebookException error) { // frag3.setFbId(null); // ---------------------------- got to put // check here // onBackPressed(); } }).build(); feedDialog.show(); } else if (session.isOpened()) { // We need to get new permissions, then complete the action // when we get called back. session.requestNewPublishPermissions(new Session.NewPermissionsRequest( getActivity(), PERMISSION)); // do something WebDialog feedDialog = (new WebDialog.FeedDialogBuilder( getActivity(), Session.getActiveSession(), params)).setOnCompleteListener( new OnCompleteListener() { @Override public void onComplete(Bundle values, FacebookException error) { // frag3.setFbId(null); // ---------------------------- got to put // check here //onBackPressed(); } }).build(); feedDialog.show(); } }else if(session == null){ System.out.println("login"); } } else { Toast.makeText(getActivity(), "Please check your internet connection", Toast.LENGTH_LONG) .show(); } } 

Sin embargo, esto no me parece un enfoque correcto, ¿hay alguna manera mejor? También ¿cómo puedo detectar si la sesión de usuario ha caducado y pedir al usuario que vuelva a iniciar sesión? Los documentos no parecen revelar el funcionamiento interno del botón de inicio de sesión?

No inicie una nueva sesión …. cámbiela en el código fuente

 private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; 
  • Agregue el SDK de facebook en su proyecto
  • Añada las líneas siguientes en AndroidManifest.xml bajo etiqueta

      <activity android:name="com.facebook.LoginActivity" /> 
  • También agrega el ID de la aplicación de Facebook en string.xml

  • Declare los miembros privados

     private boolean isOnCreate; private List<String> permissions = new ArrayList<String>(); private JSONObject facebookObject; private ProgressDialog progressDialog; /** The callback. */ private final com.facebook.Session.StatusCallback callback = new com.facebook.Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { SignInActivity.this.onSessionStateChange(session, state, exception); } }; private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state == SessionState.OPENED) { if (this.isOnCreate) { this.isOnCreate = false; return; } onFacebookLoginDone(); } else if (state == SessionState.CLOSED_LOGIN_FAILED) { showErrorMessage(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Session session = Session.getActiveSession(); if (session == null) { session = new Session(this); session.closeAndClearTokenInformation(); } Session.setActiveSession(session); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_fb_login: this.loginUsingFacebook(); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } /** * Login using facebook. */ private void loginUsingFacebook() { isOnCreate = false; final Session session = Session.getActiveSession(); if (session != null && session.getState().equals(SessionState.OPENED)) { Session.openActiveSession(this, true, this.callback); onFacebookLoginDone(); } else { final Session.OpenRequest temp = new Session.OpenRequest(this); this.permissions.clear(); this.permissions.add(UserClass.EMAIL); this.permissions.add("user_location"); temp.setPermissions(this.permissions); temp.setCallback(this.callback); session.openForRead(temp); } } /** * On facebook login done. */ private void onFacebookLoginDone() { final Bundle bundle = new Bundle(); bundle.putString("fields", "first_name,last_name,id,location,locale,username,email,verified"); new PerformSignUpOnServer("/me", bundle).execute(); } /** * The Class PerformSignUpOnServer. */ private class PerformSignUpOnServer extends AsyncTask<Void, Void, Void> { /** The server url. */ private String serverURL; /** The server bundle. */ private Bundle serverBundle; /** * Instantiates a new perform sign up on server. * * @param url * the url * @param bundle * the bundle */ public PerformSignUpOnServer(String url, Bundle bundle) { this.serverBundle = bundle; this.serverURL = url; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(SignInActivity.this, "", "Loading..."); super.onPreExecute(); } /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Void doInBackground(Void... params) { signUpUserOnServer(this.serverURL, this.serverBundle); return null; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Void result) { } } /** * Sign up user on server. * * @param url * the url * @param bundle * the bundle */ private void signUpUserOnServer(String url, Bundle bundle) { final Session session = Session.getActiveSession(); if (session != null && session.isClosed() == false) { final Request userInformation = new Request(session, url, bundle, HttpMethod.GET); final Response response = userInformation.executeAndWait(); facebookObject = response.getGraphObject().getInnerJSONObject(); Log.d("json", facebookObject.toString()); } } /** * On session state change. * * @param state * the state */ private void onSessionStateChange(SessionState state) { if (state == SessionState.OPENED) { if (isOnCreate) { isOnCreate = false; return; } onFacebookLoginDone(); } } 

    Vea su gato del registro con la etiqueta "json" usted tendrá un objeto del facebook

  • Inicie sesión en facebook en android utilizando REST API
  • Mientras que ParseLoginUI que carga el hilandero está trabajando la actividad es visible en el fondo
  • No se puede compartir texto con un enlace a través de Android Share Intent
  • Android: ¿Cómo compartir la imagen con texto en facebook mediante la intención?
  • Facebook Connect / phonegap - "nativeInterface" parámetro dentro de FB.init llamada, lo que hace?
  • No se pueden obtener las solicitudes de entrada de facebook
  • Android: Cómo utilizar más de un paquete en la configuración de la aplicación de Facebook
  • Invitar amigos de Facebook a mi aplicación
  • ¿Cómo hacer que el menú de aplicaciones de Facebook sea nuevo en Android?
  • Parámetro android_key no válido mientras usa SDK de Facebook
  • Error de LoginButton.java - problemas para comenzar con facebook sdk en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.