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

时间:2017-10-06 10:42:10

标签: android facebook android-facebook launchmode

我已将facebook登录添加到我的应用中。

我第一次能够毫无问题地登录。但登录后我退出。我在logcat中收到此错误。

E/LoginFragment: Cannot call LoginFragment with a null calling package. This can occur if the launchMode of the caller is singleInstance.

我搜索谷歌了一下。通过将launchmode设置为standard来解决一些错误。我没有指定任何启动模式。但我还是试着用

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

但没有成功。

这是我登录的程序。

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

2我在Application onCreate() super.onCreate()AppEventsLogger.activateApp(this);初始化了FB sdk。 CallbackManager

3在我的登录活动中,在onCreate()活动中创建了@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); callbackManager = CallbackManager.Factory.create(); setContentView(R.layout.activity_login); } 个实例。

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

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

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

5我在onActivityResult()

中注册了回调
LoginManager.getInstance().logOut()

6要退出,我使用了LoginManager.getInstance().registerCallback()

7但是我尝试使用自定义按钮再次登录,调试指针转到行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. )回调得到调用。我得到一个日志try statementList1 finally command; command_that_raises; critical_command; end

2 个答案:

答案 0 :(得分:1)

更改此

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

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

答案 1 :(得分:0)

首先,Facebook并没有提供确切的例外细节。

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

我想从我的LoginActivity中隔离facebook登录代码并将JSONObject返回给LoginActivity,因此我创建了一个用于处理SocialLogin.java的社交登录的类,并通过<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css"> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/js/jquery.jqGrid.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/js/i18n/grid.locale-en.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/css/ui.jqgrid.css" rel="stylesheet"/> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqgrid/4.6.0/plugins/searchFilter.css"> <table id="grid-table"></table> <div id="grid-pager"></div>在SocialLogin.java中注册了回调。有关更多详细信息,请访问facebook LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { //More Stuff here }的登录信息,请参阅相关的完整代码。

这是实际问题。所以我在LoginActivity.java中进行了这些调用(registerCallback()和logInWithReadPermissions())并且它有效。

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