Android Facebook SDK 4.0 Вход без приложения для Facebook

У меня возникли проблемы с входом в webview для Facebook на Android.

Я следил за учебниками, и логин прекрасно работает, когда у пользователя установлено приложение Facebook. Когда приложение Facebook не установлено, появляется веб-просмотр для входа в facebook; однако после входа в систему и принятия разрешений веб-просмотр просто перенаправляется обратно на экран входа в систему. Он никогда не возвращается в мое приложение.

Кто-нибудь еще столкнулся с этой проблемой?

    FacebookSdk.sdkInitialize(this);
    profileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(Profile profile, Profile profile2) {
            if (profile2 != null) {
                loggedIn(profile2);
            } else {
                loggedOut();
            }
        }
    };
    accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken accessToken, AccessToken accessToken2) {
            Profile.fetchProfileForCurrentAccessToken();
        }
    };
    callbackManager = CallbackManager.Factory.create();
    LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // App code
                    getProfileInfo();
                }

                @Override
                public void onCancel() {
                    // App code
                    Log.e("Facebook Login", "Login Cancelled");
                    loggedOut();
                }

                @Override
                public void onError(FacebookException exception) {
                    // App code
                    Log.e("Facebook Login", "Failed to Login " + exception.toString());
                    loggedOut();
                }
            });

При просмотре журналов без фильтров во время входа в систему я вижу несколько возможных журналов.

I/chromium﹕ [INFO:CONSOLE(0)] "event.returnValue is deprecated. Please use the standard event.preventDefault() instead.", source:  (0)
I/Auth.Core﹕ [TokenCache] Missing snowballing token: no granted scopes set.

Ответы

Ответ 1

Что вызвало проблему, так это то, что я переопределял onclicklistener кнопки входа в систему, чтобы вызвать функцию входа в LoginManager. Просто не делайте.

Ответ 2

Я думаю, вы забыли использовать callbackManager для правильного рабочего процесса. Использованный CallbackManager для обратного вызова регистрации должен быть вызван в onActivityResult активности хоста. Активность не должна быть в singleInstance launchMode, потому что она не сможет запустить startActivityForResult (facebook внутренне запускает FacebookActivity, используя этот метод). Поэтому добавьте в свою деятельность:

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

Ответ 3

Учитывая ваше описание, я воображаю, что вы либо не подключены в Интернете , либо, что вы не обрабатываете обратные вызовы входа.

Вот полный фейсбук 4.0. + пример входа в систему.

Изменить На основе вашего кода:

Вам нужно использовать FacebookSdk.sdkInitialize(this); до setContentView().

Ответ 4

Это рабочий пример без использования приложения Facebook, и если вы закроете приложение и снова его откроете, вы автоматически войдете в систему, если не выйдете из системы. Здесь мы получаем адрес электронной почты пользователя и список друзей после входа в систему.

public class MainActivity extends Activity {

    private CallbackManager callbackManager;
    private LoginButton loginButton;
    private static final String TAG = "logTag";
    private TextView mFriend, mEmail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();

        setContentView(R.layout.activity_main);
        mFriend = (TextView) findViewById(R.id.tv_friend);
        mEmail = (TextView) findViewById(R.id.tv_email);

        loginButton = (LoginButton) findViewById(R.id.login_button);
        loginButton.setReadPermissions(Arrays.asList("public_profile, email, user_birthday, user_friends"));
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(TAG, "Successful Login");
                GraphRequest friendsRequest = GraphRequest.newMyFriendsRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONArrayCallback() {
                            @Override
                            public void onCompleted(JSONArray objects, GraphResponse response) {


                                String x = objects.opt(0).toString();
                                mFriend.setText(x);

                            }
                        });
                GraphRequest meRequest = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                try {
                                    String email = response.getJSONObject().getString("email").toString();
                                    mEmail.setText(email);
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        });

                Bundle parameters = new Bundle();
                parameters.putString("fields", "id, name, email, gender");
                meRequest.setParameters(parameters);
                meRequest.executeAsync();

                parameters = new Bundle();
                parameters.putString("field", "user_friends");
                friendsRequest.setParameters(parameters);
                friendsRequest.executeAsync();

            }

            @Override
            public void onCancel() {
                Log.d(TAG, "Login Canceled");
            }

            @Override
            public void onError(FacebookException error) {
                Log.d(TAG, "Login Error");
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        // manage login results
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
}