Использование диалога общего доступа в 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. Возможно, нужно добавить некоторые разрешения?)
Ответы
Ответ 1
См. 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, и оно всегда будет истинным, если не произошла ошибка. Это по дизайну.
Ответ 2
Чтобы получить результат для совместного использования, ваше приложение должно иметь хотя бы разрешение 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/
Ответ 3
@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.
Ответ 4
Внедрите FacebookCallback<Sharer.Result>
, чтобы узнать, был ли обмен удален или отменен или произошла ошибка.
Вы можете использовать код в разделе "Активность" и "Фрагмент". При использовании во Фрагменте убедитесь, что вы передали this
в конструкторе ShareDialog. Если вы пройдете getActivity()
, то метод onActivityResult
не будет запущен во Фрагменте.
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);
}
Ответ 5
Используйте этот код: -
/**
* 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);
}
}
Ответ 6
Заголовок ## 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);
}