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?
- Autorización a través de Facebook Aplicación para Android sin SDK de Facebook
- Facebook autoriza que no funcione dentro de Android Asynctask o Thread
- ¿Cómo utilizo las preferencias compartidas en un fragmento de Android?
- Utilizar variables de entorno / parametrizar config.xml
- Java.lang.NoClassDefFoundError: com.facebook.android.Facebook
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?
- Cómo agregar una devolución de llamada de cierre de sesión para facebook sdk en android
- Facebook Android SDK v2.3 Llamada inesperada a LoginManager.onActivityResult
- Facebook login No se puede pasar un permiso de publicación o gestión (correo electrónico) a una solicitud de autorización de lectura
- La aplicación de ejemplo de Android Facebook no inicia sesión cuando se instala la aplicación FB
- OAuthException al intentar publicar en la pared de amigos
- Facebook android sdk sharedialog devolución de llamada siempre es un éxito
- Cómo utilizar el token de acceso de Facebook en la vista de la aplicación de Android
- ¿Por qué mi solicitud de AppInviteDialog de Facebook no está siendo recibida por el amigo de destino?
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