Uso del diálogo compartido en Android Facebook SDK. ¿Cómo saber si el usuario comparte o cancela la actividad compartida?

He añadido funcionalidad de uso compartido a la aplicación de Android como se describe aquí https://developers.facebook.com/docs/android/share-dialog/#setup

Pero he notado que si el usuario está cancelado compartir la actividad onComplete se llama de todos modos

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() { @Override public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) { Log.e("Activity", String.format("Error: %s", error.toString())); } @Override public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) { Log.e("Activity", "Success!"); } }); } 

También he mirado adentro al paquete que se vuelve. Incluso si cancelo el diálogo compartido,

 com.facebook.platform.extra.DID_COMPLETE=true 

¿Cómo puedo obtener resultados que el usuario realmente compartió datos en facebook? (Sin hacer login por separado con el botón de facebook. ¿Quizás algunos permisos necesitan ser agregados?)

6 Solutions collect form web for “Uso del diálogo compartido en Android Facebook SDK. ¿Cómo saber si el usuario comparte o cancela la actividad compartida?”

Consulte https://developers.facebook.com/docs/android/share-dialog/#handling-responses

Puede saber si el usuario ha cancelado llamando al

 String gesture = FacebookDialog.getNativeDialogCompletionGesture(data); if (gesture != null) { if ("post".equals(gesture)) { // the user hit Post } else if ("cancel".equals(gesture)) { // the user hit cancel } else { // unknown value } } else { // either an error occurred, or your app has never been authorized } 

Donde los datos son el paquete de resultados. Sin embargo, sólo devolverá un valor no nulo SI el usuario ha iniciado sesión a través de su aplicación (es decir, tiene al menos permisos de base_info). Si el usuario nunca ha iniciado sesión o autorizado su aplicación, lo único que verá es DID_COMPLETE y siempre será verdadero a menos que se produzca un error. Esto es por diseño.

Para obtener el resultado del uso compartido, tu aplicación debe tener al menos el permiso basic_info.

Para solucionarlo, basta con abrir una sesión (esto solicitará automáticamente el permiso de base_info):

 Session.openActiveSession(this /*your activity*/, true /*allows the UI login to show up if needed*/, new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { Log.i("[Facebook]", "Session: " + state.toString()); if (session.isOpened()) { /// now you are good to get the sharing results } } }); 

Puede encontrar más información aquí: https://developers.facebook.com/docs/android/getting-started/

  @Override public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) { if (data.getString("com.facebook.platform.extra.COMPLETION_GESTURE").equals("cancel")) return; } 

El valor de data.getString ("com.facebook.platform.extra.COMPLETION_GESTURE") es "publicar" cuando el usuario publicó en Facebook.

Implementar FacebookCallback<Sharer.Result> para saber si se compartió correctamente o se canceló o si se produjo un error.

Puede utilizar el código de abajo en Actividad y en Fragmento también. Cuando se utiliza en Fragmento, asegúrese de pasar this en el constructor ShareDialog. Si pasa getActivity() entonces el método onActivityResult no se activará en Fragmento.

 private CallbackManager callbackManager; private void shareYourContentOnFacebook() { callbackManager = CallbackManager.Factory.create(); ShareDialog shareDialog = new ShareDialog(this); shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() { @Override public void onSuccess(Sharer.Result result) { Log.d(this.getClass().getSimpleName(), "shared successfully"); //add your code to handle successful sharing } @Override public void onCancel() { Log.d(this.getClass().getSimpleName(), "sharing cancelled"); //add your code to handle cancelled sharing } @Override public void onError(FacebookException error) { Log.d(this.getClass().getSimpleName(), "sharing error"); //add your code to handle sharing error } }); if (ShareDialog.canShow(ShareLinkContent.class)) { ShareLinkContent shareLinkContent = new ShareLinkContent.Builder() .setContentTitle("Your content title") .setContentDescription("Your content description") .setContentUrl(Uri.parse(""http://your-content-url.com"")) .build(); shareDialog.show(shareLinkContent); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); } 

Utilice este código: –

 /** * Facebook Dialog Callback * * Called up when come back from Share Dialog * */ private class FacebookDialogCallBack implements FacebookDialog.Callback { @Override public void onComplete(PendingCall pendingCall, Bundle data) { //Show Toast Message showToastMessage(data); } @Override public void onError(PendingCall pendingCall, Exception error, Bundle data) { //Show Toast Message showToastMessage(data); } } //Show Toast Message private void showToastMessage(Bundle data) { //Get Native Dialog Did Complete boolean didComplete = FacebookDialog.getNativeDialogDidComplete(data); if(didComplete) { //Get Native Dialog Completion Gesture String nativeDialogCompletionGesture = FacebookDialog.getNativeDialogCompletionGesture(data); if (nativeDialogCompletionGesture == null || FacebookDialog.COMPLETION_GESTURE_CANCEL.equals(nativeDialogCompletionGesture)) { //Show Publish Cancel Toast UIUtil.showToast(R.string.toast_message_share_publish_cancelled); } else { //Show Success Post Toast UIUtil.showToast(R.string.toast_message_share_success_post); } } else { //Show Publish Cancel Toast UIUtil.showToast(R.string.toast_message_share_publish_cancelled); } } 

Encabezado ## private static ShareDialog shareDialog;

  private static FacebookCallback<Sharer.Result> shareCallback = new FacebookCallback<Sharer.Result>() { @Override public void onCancel() { Log.d("HelloFacebook", "Canceled"); } @Override public void onError(FacebookException error) { Log.d("HelloFacebook", String.format("Error: %s", error.toString())); String title = this.getActivty().getString(R.string.error); String alertMessage = error.getMessage(); showResult(title, alertMessage); } @Override public void onSuccess(Sharer.Result result) { Log.d("HelloFacebook", "Success!"); // 不为空,才分享成功if (result.getPostId() != null) { String title = this.getActivty().getString(R.string.success); String id = result.getPostId(); String alertMessage = this.getActivty().getString(R.string.successfully_posted_post, id); showResult(title, alertMessage); } } private void showResult(String title, String alertMessage) { new AlertDialog.Builder(this.getActivty()) .setTitle(title) .setMessage(alertMessage) .setPositiveButton(R.string.ok, null) .show(); } }; protected void onCreate (Bundle savedInstanceState) { shareDialog = new ShareDialog(this. getActivty()); shareDialog.registerCallback( callbackManager, shareCallback); } 
  • LikeView Callback
  • Cerrar sesión Facebook Android SDK
  • La fuente de Android SDK de Android no se compilará con Eclipse Indigo
  • ¿Cuál es el código para obtener un token actualizado de Facebook en una aplicación para Android?
  • Facebook autoriza que no funcione dentro de Android Asynctask o Thread
  • Facebook y GoogleAnalytics está causando la señal fatal 11 (SIGSEGV)
  • SDK de Android Facebook: errores al importar SDK
  • La aplicación de Android con Facebook no funciona con la aplicación de Facebook instalada
  • Obtención de error de parámetro android_key no válido, después de iniciar sesión por primera vez en Facebook Android SDK
  • Algo similar a Cocoa Pods y Bundler para Android (para dependencias)?
  • Ocultar barra de estado durante el diálogo de inicio de sesión de Facebook
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.