使用LoginManager登录Android Facebook SDK 4.0

nig*_*xed 7 android facebook-login facebook-sdk-4.0

我正在尝试将旧应用程序的登录代码从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);
Run Code Online (Sandbox Code Playgroud)

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

我认为这不重要,但代码是在包装类(外部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" />
Run Code Online (Sandbox Code Playgroud)

小智 11

如果您的代码位于片段中,请不要将mActivity变量用作Activity上下文.

去做:

  1. 添加一行:

     callbackManager.onActivityResult(requestCode, resultCode, data); in onActivityResult(, , , ) in fragment.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 呼叫:

     LoginManager.getInstance().logInWithReadPermissions(**this**, Arrays.asList("public_profile", "user_friends")); 
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 当然,完成.