Intereting Posts
Сортировка ListView по имени продукта с помощью пользовательского адаптера? Copy-paste не работает в Android Studio на Mac Как использовать встроенный менеджер загрузок на Android «Ваш APP_BUILD_SCRIPT указывает на неизвестный файл: ./jni/Android.mk" Просто обновил мою ОС X до Yosemite, Android Device Chooser, не показывающий устройство – что делать? SetVisibility (GONE) становится невидимым, но все еще занимает пространство Android Studio 2.2 Preview 1 Проблемы с рендерингом Как установить Android SDK на Ubuntu? Не все данные, показанные, когда логарифмический режим Android читается программно Настройка многоканального субтитров SupportActionBar Ориентировочное расположение андроидов ниже 2 элементов Android: minHeight не работает в webview Android, этот API помечен как внутренний для библиотеки поддержки и не должен быть доступен из приложений. Не удалось включить INSERT в SQLite, код ошибки: 19 Консенсус по ленивой загрузке битмапов в адаптере (выделение на Bitmap.recycle ())

Использование диалога общего доступа в Android Facebook SDK. Как узнать, действительно ли пользователь разделяет или отменяет совместную деятельность?

Я добавил функции совместного использования в Android-приложение, как описано здесь. Https://developers.facebook.com/docs/android/share-dialog/#setup

Но я заметил, что если пользователь отменяет совместную деятельность, то onComplete вызывается в любом случае

@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!"); } }); } 

Я также посмотрел на Bundle, который возвращается. Даже если я отменил диалог доступа, я получаю

 com.facebook.platform.extra.DID_COMPLETE=true 

Как я могу получить результат, который пользователь действительно поделил данными на facebook? (Без отдельного входа в систему с помощью кнопки facebook. Возможно, нужно добавить некоторые разрешения?)

Solutions Collecting From Web of "Использование диалога общего доступа в Android Facebook SDK. Как узнать, действительно ли пользователь разделяет или отменяет совместную деятельность?"

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

Вы можете узнать, отменен ли пользователь, позвонив

 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 } 

Где данные являются результатом. Тем не менее, он возвращает только ненулевое значение, если пользователь выполнил вход через ваше приложение (то есть у вас есть хотя бы разрешения basic_info). Если пользователь никогда не вошел в систему или не авторизировал ваше приложение, то единственное, что вы увидите, это DID_COMPLETE, и оно всегда будет истинным, если не произошла ошибка. Это по дизайну.

Чтобы получить результат для совместного использования, ваше приложение должно иметь хотя бы разрешение basic_info.

Чтобы решить эту проблему, просто откройте сеанс (это автоматически запросит разрешение basic_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 } } }); 

Дополнительную информацию можно найти здесь: 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; } 

Значение data.getString («com.facebook.platform.extra.COMPLETION_GESTURE») является «post», когда пользователь сделал сообщение в Facebook.

Внедрите FacebookCallback<Sharer.Result> чтобы узнать, был ли обмен удален или отменен или произошла ошибка.

Вы можете использовать код в разделе «Активность» и «Фрагмент». При использовании во Фрагменте убедитесь, что вы передали this в конструкторе ShareDialog. Если вы передадите getActivity() тогда метод onActivityResult не будет запущен в Fragment.

 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); } 

Используйте этот код: –

 /** * 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); } } 

Заголовок ## 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); }