Facebook Android SDK v2.3对LoginManager.onActivityResult的意外调用

Chi*_*.19 4 android facebook

<< EDITED >>
我正在尝试在我的Android应用程序中升级facebook SDK.我正在关注facebook开发者网站上的文档.我想做一些修改

1)我想从DialogFragment登录而不是直接在活动中
2)我想使用我自己的按钮进行Facebook登录

这就是我的活动:

public class MainActivity extends ActionBarActivity {
    private static final String TAG = MainActivity.class.getName();

    private CallbackManager mFBCallbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Setup FB SDK add login callback
        FacebookSdk.sdkInitialize(this.getApplicationContext());
        mFBCallbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(mFBCallbackManager, new FacebookCallback<LoginResult>() {

            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(TAG, "FB Login successfull");
            }

            @Override
            public void onCancel() {
                Log.d(TAG, "FB Login cancelled");
            }

            @Override
            public void onError(FacebookException e) {
                Log.d(TAG, "Error while performing FB login", e);
            }
        });

        // Open login dialog
        Button loginBtn = (Button) findViewById(R.id.login_btn);
        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new LoginDialog().show(getSupportFragmentManager(), TAG);
            }
        });
    }

    @Override
    protected void onActivityResult( int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // foward onActivityResult call to the FB callback manager
        mFBCallbackManager.onActivityResult(requestCode, requestCode, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我的DialogFragment的样子:

public class LoginDialog extends DialogFragment {

    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View rootView = inflater.inflate(R.layout.login_dialog, null);

        Button fbLoginBtn = (Button) rootView.findViewById(R.id.fb_login_btn);
        fbLoginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LoginManager.getInstance().logInWithReadPermissions(
                        getActivity(),
                        Arrays.asList("basic_info"));
            }
        });

        builder.setView(rootView);
        return builder.create();
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为设置看起来像Facebook提到的所需步骤,但我是我的FacebookCallback.onError(FacebookException)被调用在logcat上显示这个.异常"对LoginManager.onActivityResult的意外调用"的特定消息

04-03 12:01:26.390    8229-8229/com.jpdevs.fbv23 D/com.jpdevs.fbv23.MainActivity? Error while performing FB login
    Unexpected call to LoginManager.onActivityResult
            at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:187)
            at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:140)
            at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.java:82)
            at com.jpdevs.fbv23.MainActivity.onActivityResult(MainActivity.java:65)
            at android.app.Activity.dispatchActivityResult(Activity.java:6135)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3535)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3582)
            at android.app.ActivityThread.access$1300(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多细节,我在整个项目中创建了这个回购:https://github.com/jorgep19/fb_login

Sul*_*ain 26

我有这个问题,当我告诉你"秘密"时你会做一个facepalm.如果你只是希望解决方案走到尽头,我会解释为什么会加薪.

当发生这种情况时,facebook的源代码会抛出此错误:

if (exception == null && newToken == null && !isCanceled) {
    exception = new FacebookException("Unexpected call to LoginManager.onActivityResult");
}
Run Code Online (Sandbox Code Playgroud)

所以这3个参数正在发生一些事情.

我正在阅读代码,我发现这可能是resultCode的一些问题,因为它没有返回Activity.RESULT_OK.

关键:你已经在resultCode参数上传递了两次requestCode ...只需改变这个:

mFBCallbackManager.onActivityResult(requestCode, requestCode, data);
Run Code Online (Sandbox Code Playgroud)

通过

mFBCallbackManager.onActivityResult(requestCode, resultCode, data);
Run Code Online (Sandbox Code Playgroud)