如果使用 FaceBook Lite,使用 Facebook 登录会使应用程序崩溃

Login with facebook crash the app if using FaceBook Lite

在我的应用程序中,我使用 facebook SDK 来执行登录和注册方法。

当我有一般的 Facebook 应用程序或在我的设备上使用普通的网络浏览器时没问题。

但是当我的设备上有 FaceBook Lite 而我没有通用的 FaceBook 应用程序时,当我尝试 login/sign 使用 facebook-sdk 应用程序没有任何关闭就关闭了 log/messages,所以我不知道为什么会出现这个问题。

我该如何解决这个问题? - 我可以跳过 FaceBook Lite 应用程序并改用浏览器吗?

更新:

Here is a video if I have normal facebook app, no problems.

Here is a video if I have the face book app lite on my device, which make it crash.

我的代码片段:

LoginManager.getInstance()
                    .logInWithReadPermissions(getActivity(), Arrays.asList("public_profile"));

            LoginManager.getInstance()
                    .registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(final LoginResult loginResult) {
                            Log.i("MainActivity", "@@@onSuccess");
                            GraphRequest request = GraphRequest
                                    .newMeRequest(loginResult.getAccessToken(),
                                            (object, response) -> {
                                                Log.i("MainActivity",
                                                        "@@@response: " + response.toString());

                                                try {

                                                    ///
                                                } catch (JSONException e) {
                                                    ////

                                                }
                                            });

                        }

                        @Override
                        public void onCancel() {
                            Log.i("MainActivity", "@@@onCancel");
                        }

                        @Override
                        public void onError(FacebookException error) {
                            Log.i("MainActivity", "@@@onError: " + error.getMessage());
                        }

                    });

你知道 FB 的座右铭 - 快速行动,打破陈规。 SDK 与本机应用程序的集成是有时会中断的事情之一。

您可以强制Facebook SDK 使用网页登录:

LoginManager.getInstance().setLoginBehavior(LoginBehavior.WEB_ONLY)

下面的代码适用于 facebook。 如果它在 devide 中找不到任何 facebook 应用程序,它将打开 webView 并获取数据 在 onCreate() 或 onStart() 中调用以下方法:

private void facebookCallback() {
    callbackManager = CallbackManager.Factory.create();

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

            progressDialog.setMessage("Connection Facebook...");
            progressDialog.show();

            String accessToken = loginResult.getAccessToken().getToken();
            Log.i("accessToken", accessToken);

            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {

                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    Log.i("LoginActivity", response.toString());
                    try {
                        System.out.println("----------------------"+object.get("email").toString());
                        verifySocialAccount(object.get("email").toString());
                    } catch (JSONException e) {
                        LoginManager.getInstance().logOut();

                        progressDialog.dismiss();
                        Toast.makeText(LoginActivity.this,"Can not find email Address.",Toast.LENGTH_SHORT).show();
                    }
                }
            });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
            request.setParameters(parameters);
            request.executeAsync();
        }

        @Override
        public void onCancel() {
            System.out.println("-------onCancel");
        }

        @Override
        public void onError(FacebookException error) {
            System.out.println("---------onError");
            Log.v("LoginActivity", error.getCause().toString());
        }
    });
}

Activity代码XML:

<LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_marginLeft="20dp"
                    android:layout_marginRight="20dp"
                    android:layout_marginTop="10dp"
                    android:layout_weight="1"
                    android:layout_marginBottom="10dp"
                    android:orientation="horizontal"
                    android:weightSum="6">


                    <com.facebook.login.widget.LoginButton
                        xmlns:facebook="http://schemas.android.com/apk/res-auto"
                        android:id="@+id/btnFacebook"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/facebookBlue"
                        android:paddingTop="15dp"
                        android:paddingLeft="15dp"
                        facebook:com_facebook_login_text="SIGN IN WITH FACEBOOK"
                        android:paddingBottom="15dp"
                        android:textColor="@color/white"
                        android:textSize="15dp" />
                </LinearLayout>

好吧,我在某些 LOLIPOP 设备中获得有线行为,甚至在打开 Facebook 本机应用程序之前关闭应用程序,在其他设备应用程序仅与 facebook lite 关闭,但是。

我在 activity 上使用 noHistory=true 属性,因此一旦由于调用 onStop().[=13= 而出现对话框,activity 就会从堆栈中删除]

<activity
        android:name=".AuthActivity"
        android:screenOrientation="portrait"
        android:noHistory="true"
        android:windowSoftInputMode="stateHidden" />

删除该属性后,现在可以正常使用了!