Android Facebook SDK 4.0 使用 LoginManager 登录

Android Facebook SDK 4.0 login with LoginManager

我正在尝试将旧应用程序的登录代码从 SDK 3.0 迁移到 SDK 4.0。 我已经使用 LoginManager 实现了登录,因为我有自定义登录按钮。

问题是我没有收到来自 Facebook API 的回复。没有成功,没有错误,没有抛出任何异常。代码如下:

    //global refs
    //callbacks
    private CallbackManager mCallbackManager;
    private FacebookCallback<LoginResult> mFacebookCallback;

    private List<String> mPermissions = Arrays.asList("email");
    private LoginManager mLoginMgr;
    private Activity mActivity;

    //........

    //code is inside method
    FacebookSdk.sdkInitialize(getApplicationContext());

    //perhaps a bit excessive
    FacebookSdk.addLoggingBehavior(LoggingBehavior.GRAPH_API_DEBUG_INFO);
    FacebookSdk.addLoggingBehavior(LoggingBehavior.DEVELOPER_ERRORS);
    FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
    FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_RAW_RESPONSES);
    FacebookSdk.setApplicationId(mActivity.getString(R.string.sample_fb_id));

    //init callbacks
    mFacebookCallback = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.v("LoginActivity login", loginResult.toString());
            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    // Application code
                    Log.v("LoginActivity", response.toString());
                    try {
                        String email = object.getString("email");
                        Log.v("LoginActivity", "obtained email: ", email);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
            request.executeAsync();
        }
        @Override
        public void onCancel() {
            Log.e("LoginActivity", "facebook login canceled");
        }

        @Override
        public void onError(FacebookException e) {
            Log.e("LoginActivity", "facebook login failed error");
        }
    };
    mCallbackManager = CallbackManager.Factory.create();
    mLoginMgr = LoginManager.getInstance();
    mLoginMgr.registerCallback(mCallbackManager, mFacebookCallback);
    mLoginMgr.logInWithReadPermissions(mActivity, mPermissions);

使用 Debugger,我可以看到这一行: mLoginMgr.logInWithReadPermissions(mActivity, mPermissions); 被执行,但 callbacks 的 none 被触发。我在控制台也没有错误,设备屏幕变黑,没有任何反应。

我认为这无关紧要,但代码是在包装器 class 中执行的(在 Activity 之外)。我在 Activity 内试过,但没有任何区别。

有什么建议吗? 非常感谢。

编辑:

这是在AndroidManifest.xml中声明的:

<activity android:name="com.facebook.FacebookActivity"
          android:theme="@android:style/Theme.Translucent.NoTitleBar"
          android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
          android:label="@string/app_name" />

如果您的代码在片段中,请不要使用 mActivity 变量作为 Activity 上下文。

待办事项:

  1. 添加一行:

     callbackManager.onActivityResult(requestCode, resultCode, data); in onActivityResult(, , , ) in fragment.
    
  2. 通话:

     LoginManager.getInstance().logInWithReadPermissions(**this**, Arrays.asList("public_profile", "user_friends")); 
    

使用this,不使用this.getActivity()

  1. 好的,完成。

我也有这个问题。结果我忘了按照登录指南 Register a Callback section 的底部在 Activity.onActivityResult() 中添加对 callbackManager.onActivityResult() 的调用。

因此,在您进行 Facebook 登录的 Activity 中,您应该有如下内容:

@Override
protected void onActivityResult(int request, int result, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mCallbackManager.onActivityResult(request, result, data);
}

这是你错过的吗?

/** login manager */
    public void initializeLoginManager(){
        callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        // App code
                    }

                    @Override
                    public void onCancel() {
                        // App code
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                    }
                });
    }

public void onClick(View view) {
        switch(view.getId()){
            case R.id.button_login_login :
                firebaseloginEmail();
                break;

            case R.id.text_forget_password : break;//TODO: implement This with the layout

            case R.id.text_dont_account_login :
                startActivity(new Intent(this,SignupActivity.class));
                finish();
                break;

            case R.id.button_facebook_login :
                Log.e("facebook login","You have clicked");
                LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this,Arrays.asList(EMAIL));
                break;

        }
    }