简体   繁体   English

使用LoginManager登录Android Facebook SDK 4.0

[英]Android Facebook SDK 4.0 login with LoginManager

I am trying to migrate login code of an old application from SDK 3.0 to SDK 4.0. 我正在尝试将旧应用程序的登录代码从SDK 3.0迁移到SDK 4.0。 I have implemented the Login using the LoginManager , as I have custom Login buttons. 我使用LoginManager实现了Login,因为我有自定义登录按钮。

The problem is that I get no response from the Facebook API. 问题是我没有得到Facebook API的回应。 No success, no error, no exception thrown whatsoever. 没有成功,没有错误,没有任何异常抛出。 The code is as below: 代码如下:

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

Using the Debugger , I am able to see that this line: mLoginMgr.logInWithReadPermissions(mActivity, mPermissions); 使用Debugger ,我能够看到这一行: mLoginMgr.logInWithReadPermissions(mActivity, mPermissions); gets executed, but none of the callbacks are ever triggered. 执行,但没有触发任何callbacks I also have no errors in console, and the Device screen goes black and nothing happens. 我在控制台中也没有错误,设备屏幕变黑,没有任何反应。

I don't think it matters, but the code is executed in a wrapper class (outside Activity ). 我认为这不重要,但代码是在包装类( Activity之外)中执行的。 I tried inside the Activity , but it made no difference. 我在Activity尝试过,但没有任何区别。

Any suggestions? 有什么建议? Much appreciated. 非常感激。

Edit: 编辑:

This is declared inside AndroidManifest.xml : 这是在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" />

If your code is in a fragment, do not use mActivity variable as Activity context. 如果您的代码位于片段中,请不要将mActivity变量用作Activity上下文。

To do: 去做:

  1. Add a line: 添加一行:

      callbackManager.onActivityResult(requestCode, resultCode, data); in onActivityResult(, , , ) in fragment. 
  2. Call: 呼叫:

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

Use this , not use this.getActivity() 使用 ,不要使用this.getActivity()

  1. Sure, Done. 当然,完成。

I had this problem also. 我也有这个问题。 Turns out I forgot to add the call to callbackManager.onActivityResult() in Activity.onActivityResult() as per the bottom of the Register a Callback section of the login guide. 结果我忘了在Activity.onActivityResult()添加对callbackManager.onActivityResult()的调用,如登录指南的Register a Callback部分的底部。

So in the Activity in which you're doing Facebook login, you should have something like: 因此,在您正在进行Facebook登录的活动中,您应该具有以下内容:

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

Is this what you were missing? 这是你错过的吗?

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

        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM