Войти с facebook приложение, если с помощью FaceBook Lite в

в моем приложении я использую facebook SDK для выполнения методов входа и регистрации.

Это нормально, когда у меня есть общие FaceBook приложение или использование обычного веб-браузера на моем устройстве.

но когда у меня есть FaceBook Lite на моем устройстве, и у меня нет вообще FaceBook приложение, когда я пытаюсь войти / зарегистрироваться с помощью facebook-sdk, приложение просто закрывается без журнала / сообщений, поэтому я не могу знать, почему это проблема случилась.

Как я могу исправить эту проблему? - Можно я пропущу?--2-- > FaceBook Lite app и использовать браузер вместо этого?

обновление:

вот видео, Если у меня есть обычное приложение facebook, никаких проблем.

вот видео, Если у меня есть приложение face book lite на моем устройстве, что делает его сбой.

мой фрагмент кода:

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());
                        }

                    });

4 ответов


вы знаете девиз FB-двигайтесь быстро и ломайте вещи. Интеграция SDK с родными приложениями-одна из вещей, которая иногда ломается.

вы можете заставить Facebook SDK использовать web для входа:

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

попробуйте следующий код, если он работает

private CallbackManager callbackManager;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);
//TODO on click of fb custom button call handleFBLogin()
 callbackManager = CallbackManager.Factory.create();
}

private void setFacebookData(final LoginResult loginResult) {
        GraphRequest request = GraphRequest.newMeRequest(
                loginResult.getAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        // Application code
                        try {
                            Log.i("Response", response.toString());

                            String email = response.getJSONObject().getString("email");
                            String firstName = response.getJSONObject().getString("first_name");
                            String lastName = response.getJSONObject().getString("last_name");
                            String profileURL = "";
                            if (Profile.getCurrentProfile() != null) {
                                profileURL = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), 400, 400).toString();
                            }

                           //TODO put your code here
                        } catch (JSONException e) {
                            Toast.makeText(ActivitySignIn.this, R.string.error_occurred_try_again, Toast.LENGTH_SHORT).show();
                        }
                    }
                });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,email,first_name,last_name");
        request.setParameters(parameters);
        request.executeAsync();
    }
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            callbackManager.onActivityResult(requestCode, resultCode, data);
}

private void handleFBLogin() {
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        boolean isLoggedIn = accessToken != null && !accessToken.isExpired();

        if (isLoggedIn && Store.isUserExists(ActivitySignIn.this)) {
            goToHome();
            return;
        }

        LoginManager.getInstance().logInWithReadPermissions(ActivitySignIn.this, Arrays.asList("public_profile", "email"));
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(final LoginResult loginResult) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                setFacebookData(loginResult);
                            }
                        });
                    }

                    @Override
                    public void onCancel() {
                        Toast.makeText(ActivitySignIn.this, "CANCELED", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        Toast.makeText(ActivitySignIn.this, "ERROR" + exception.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
    }

ниже кода, работающего с facebook fine. если он не найдет приложение facebook в devide, он откроет 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());
        }
    });
}

код действия 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>

Ну, я получал проводное поведение в некоторых ЛОЛИПОП устройство приложение закрывается еще до открытия Facebook родное приложение, и в других устройствах приложение близко только с facebook lite, однако.

я использовал noHistory=true атрибут для действия, поэтому действие удаляется из стека после появления диалога из-за вызова onStop().

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

после удаления этого атрибута, теперь он работает отлично!