Android Facebook 登录无法使用空调用包调用 LoginFragment

Android Facebook Login Cannot call LoginFragment with a null calling package

我已将 Facebook 登录添加到我的应用程序。

我第一次能够毫无问题地登录。但是登录后我注销了。我在 logcat.

中收到此错误
E/LoginFragment: Cannot call LoginFragment with a null calling package. This can occur if the launchMode of the caller is singleInstance.

我搜索了一下google。通过将启动模式设置为标准来解决一些错误。我没有指定任何启动模式。但我仍然尝试

<activity
     android:name=".activities.LoginActivity"
     android:launchMode="standard"/>

但是没有成功。

这是我的登录程序。

1 添加了 FB 依赖 compile 'com.facebook.android:facebook-android-sdk:[4,5)'

2 我在ApplicationClass的onCreate()super.onCreate()之后初始化FB sdk。 AppEventsLogger.activateApp(this);

3 在我的登录中 activity 在 activity 的 onCreate() 上创建了 CallbackManager 实例。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    callbackManager = CallbackManager.Factory.create();
    setContentView(R.layout.activity_login);
}

4 我使用自定义按钮登录。当我点击 fb 登录按钮时。我正在使用此代码。

LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {

                    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject object, GraphResponse response) {
                                    //My Stuff Here
                                }
                            });
                    Bundle parameters = new Bundle();

                    parameters.putString("fields", "id,name,email,gender,first_name,last_name,link,picture.type(large)");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

                @Override
                public void onCancel() {
                    //Cancel Stuff
                }

                @Override
                public void onError(FacebookException exception) {
                    exception.printStackTrace();
                    //Error Stuff
                }
            });        LoginManager.getInstance().logInWithReadPermissions((AppCompatActivity)context,
            Arrays.asList("public_profile, email"));

5 我在 onActivityResult() 中注册了回调

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

6 为了注销我使用了 LoginManager.getInstance().logOut()

7 但我尝试使用我的自定义按钮再次登录,调试指针转到行 LoginManager.getInstance().registerCallback() 但方法 none (onSuccess(LoginResult loginResult), onError() , onError(FacebookException exception)) 的回调获取调用。我收到一条日志说 E/LoginFragment: Cannot call LoginFragment with a null calling package. This can occur if the launchMode of the caller is singleInstance.

改变这个

LoginManager.getInstance().logInWithReadPermissions((AppCompatActivity)context, Arrays.asList("public_profile, email"));

LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this, Arrays.asList("public_profile, email"));

首先,Facebook 并未在此处提供确切的异常详细信息。

Sushobh Nadiger 的回答帮助我解决了这个问题。

我想将 facebook 登录代码与我的 LoginActivity 和 return JSONObject 隔离回 LoginActivity,所以我创建了一个 class 来处理名为 SocialLogin.java 的社交登录,我注册了通过 LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { //More Stuff here } 在 SocialLogin.java 中回调并调用 facebook 登录 LoginManager.getInstance().logInWithReadPermissions() 有关详细信息,请参阅相关的完整代码。

这才是真正的问题所在。所以我在 LoginActivity.java 中进行了这些调用(registerCallback() 和 logInWithReadPermissions())并且它起作用了。

但是我作为开发人员会认为像 facebook 这样的公司应该给我们正确的错误,而不是像我这样误导性的错误,这样我们宝贵的时间就不会浪费了。