【问题标题】:Android Facebook SDK ShareDialog not returning a callbackAndroid Facebook SDK ShareDialog 不返回回调
【发布时间】:2017-07-03 20:34:57
【问题描述】:

我正在将我的应用程序从本机 Share Api 转换为 ShareDialog。对话框正确显示,但我的应用程序没有收到回调,说明帖子已完成/失败/取消。我在片段中使用这个 ShareDialog,我相信这可能是我的问题的一部分。为什么没有收到回调?

这是代码...

public class FacebookSocialSelector extends SocialSelector {
    private static final String FACEBOOK_EMAIL_PREFERENCE = "facebook_email";
    private final CallbackManager mCallbackManager;
    private String mFbEmail;
    ShareDialog shareDialog;

    public FacebookSocialSelector(ShareFragment fragment, View v, ImageView iconView) {
        super(fragment, v, iconView);


        // Social login
        FacebookSdk.sdkInitialize(fragment.getContext().getApplicationContext());
        mCallbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(mCallbackManager,
                mFacebookLoginCallback);
        shareDialog = new ShareDialog(mFragment.getActivity());
        setBackgroundDisabledDrawable(R.drawable.sharebtn_left_disable);
        setBackgroundEnabledDrawable(R.drawable.sharebtn_left_enable);
        setDisabledDrawable(R.drawable.facebook_disable);
        setEnabledDrawable(R.drawable.facebook_enable);
    }

    @Override
    public void login() {
        // Check for existing login
        final String fbEmail;
        if (mFbEmail == null) {
            SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(mFragment.getActivity());
            fbEmail = prefs.getString(FACEBOOK_EMAIL_PREFERENCE, null);
        } else {
            fbEmail = mFbEmail;
        }

        if (AccessToken.getCurrentAccessToken() != null && fbEmail != null) {
            if (Profile.getCurrentProfile() != null) {
                finishLogin(true);
                mFragment.fbInfo(Profile.getCurrentProfile().getId(),
                        Profile.getCurrentProfile().getName(), fbEmail);
            } else {
                new ProfileTracker() {
                    @Override
                    protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
                        finishLogin(true);
                        mFragment.fbInfo(currentProfile.getId(),
                                currentProfile.getName(), fbEmail);
                        Profile.setCurrentProfile(currentProfile);
                        stopTracking();
                    }
                };
                Profile.fetchProfileForCurrentAccessToken();
            }
            return;
        }

        LoginManager.getInstance().logInWithReadPermissions(mFragment.getActivity(),
                Arrays.asList("public_profile", "email"));
    }

    public void finishLogin(boolean success) {
        if (success) {
            select();
            mFragment.loginSuccess();
        } else {
            mFragment.loginFailed("Could not login to FaceBook");
        }
    }



 public void doPost(String message, Bitmap bitmap) {
        ShareDialog shareDialog = new ShareDialog(mFragment.getActivity());
        if (ShareDialog.canShow(SharePhotoContent.class)) {
            Bitmap image = bitmap;
            SharePhoto photo = new SharePhoto.Builder()
                    .setBitmap(image)
// Hashtag Still not working for some reason
//                            .setShareHashtag(new ShareHashtag.Builder()
//                                    .setHashtag("#ConnectTheWorld")
//                                    .build());
                    .build();
            SharePhotoContent content = new SharePhotoContent.Builder()
                    .addPhoto(photo)
                    .build();
            shareDialog.show(content);
            shareDialog.registerCallback(mCallbackManager, new FacebookCallback<Sharer.Result>() {
                @Override
                public void onSuccess(Sharer.Result result) {
                    mFragment.postFinish(true);
                }

                @Override
                public void onCancel() {
                    mFragment.postFinish(false);
                }

                @Override
                public void onError(FacebookException error) {
                    mFragment.postFinish(false);
                }
            });

        }
    }

    @Override
    public void onLoginCallback(int requestCode, int resultCode, Intent data) {
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onPostCallback(int requestCode, int resultCode, Intent data) {
    }

    private FacebookCallback<LoginResult> mFacebookLoginCallback = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {

            Iterator<String> iterator =
                    loginResult.getRecentlyGrantedPermissions().iterator();

            boolean hasPublishPermissions = false;

            while (iterator.hasNext()) {
                String s = iterator.next();
                if (s.equalsIgnoreCase("publish_actions")) {
                    hasPublishPermissions = true;
                }
            }

            if (!hasPublishPermissions) {
                LoginManager.getInstance().logInWithPublishPermissions(mFragment.getActivity(),
                        Arrays.asList("publish_actions"));
            } else {
                GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        mGraphCallback);
                Bundle parameters = new Bundle();
                parameters.putString("fields", "email");
                request.setParameters(parameters);
                request.executeAsync();

            }
        }

        @Override
        public void onCancel() {
            Toast.makeText(mFragment.getActivity(), "Login Cancel",
                    Toast.LENGTH_LONG).show();
            finishLogin(false);
            LoginManager.getInstance().logOut();
            AccessToken.setCurrentAccessToken(null);
        }

        @Override
        public void onError(FacebookException exception) {
            Toast.makeText(mFragment.getActivity(), exception.getMessage(),
                    Toast.LENGTH_LONG).show();
            finishLogin(false);
            LoginManager.getInstance().logOut();
            AccessToken.setCurrentAccessToken(null);
        }
    };

    GraphRequest.GraphJSONObjectCallback mGraphCallback = new GraphRequest.GraphJSONObjectCallback() {
        private ProfileTracker mProfileTracker;

        @Override
        public void onCompleted(JSONObject object, GraphResponse response) {
            try {
                mFbEmail = object.getString("email");
                final Profile currentProfile = Profile.getCurrentProfile();
                PreferenceManager
                        .getDefaultSharedPreferences(mFragment.getActivity())
                        .edit()
                        .putString(FACEBOOK_EMAIL_PREFERENCE, mFbEmail)
                        .apply();
                mFragment.loginSuccess();

                if (currentProfile == null) {
                    // Profile not yet loaded
                    mFragment.fbInfo(null, null, mFbEmail);
                    mProfileTracker = new ProfileTracker() {
                        @Override
                        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
                            finishLogin(true);
                            mFragment.fbInfo(currentProfile.getId(),
                                    currentProfile.getName(), mFbEmail);
                            Profile.setCurrentProfile(currentProfile);
                            stopTracking();
                        }
                    };
                } else {
                    mFragment.fbInfo(currentProfile.getId(),
                            currentProfile.getName(), mFbEmail);
                }
            } catch (JSONException ex) {
                mFragment.loginFailed("Could not log in to FaceBook.");
            }
        }
    };

}

我在另一篇文章中找到了这个解决方案...

您也可以在 Activity 和 Fragment 中使用下面的代码。什么时候 在 Fragment 中使用确保在 ShareDialog 构造函数中传递它。 如果你通过 getActivity() 那么 onActivityResult 方法将不会 在 Fragment 中触发。

我尝试将“mFragment.getActivity()”更改为“this”和“FacebookSocialSelector.this”,但我得到一个 connot resolve constructor 错误。

编辑:如果我使用 shareDialog(mFragment) 或 shareDialog(fragment),程序编译得很好,但我仍然没有收到回调。我尝试添加调试日志,但没有被触发。

【问题讨论】:

  • 根据 THIS 这不是一个错误,它应该保持这种状态。了解用户是否接受发布的唯一方法是检查结果中的 postID。只有当用户没有取消并且用户登录到您的应用并且它具有发布权限时,您才会有一个 postID。否则它将始终为空。是的,我知道,这很糟糕。
  • @Dhiyaneshwaran 你有没有提到这是一个错误?

标签: java android facebook facebook-graph-api


【解决方案1】:

我怀疑mCallbackManager 没有调用onActivityResult(),因此您不会在注册的ShareDialog 回调中收到任何结果。首先尝试调用new ShareDialog(mFragment); 而不是new ShareDialog(mFragment.getActivity()); 然后,在您的ShareFragment 类(我假设是mFragment)中覆盖onActivityResult(requestCode, resultCode, data) 并执行以下操作:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mFacebookSocialSelector.onActivityResult(requestCode, resultCode, data);
}

mFacebookSocialSelector 指向您的 FacebookSocialSelector 类的实例。在您的 FacebookSocialSelector 类中创建一个公共方法,如下所示:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
}

希望onSuccess 在您发布帖子后会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多