Застрял на белом экране входа в Facebook / функция обратного вызова не запускается

#android #facebook

#Android #Facebook

Вопрос:

Пытаюсь войти в систему с помощью facebook, но каждый раз получаю белый экран (работает нормально только при первом входе в систему)

Экран Image_LogIn

Изображение белого экрана

  • Facebook Api — compile ‘com.facebook.android: facebook-android-sdk: [4,5)’
  • В манифесте нет тега истории
  • Пробовал проверять текущий доступ, но его нет.
  • Пробовал как в песочнице, так и в выключенном режиме

LoginButton -> (Вызывает FacebookLogIn как startActivityForResult) -> В свою очередь вызывает методы входа или выхода и после этого finish()

Пожалуйста, помогите, я понятия не имею, что не так в моем коде.

Основное действие — (вызов действия FacebookLogIn для получения результата)

     package com.example.firebasesignin;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.FacebookSdk;
import com.facebook.Profile;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    GoogleLogIn googleLogIn;
    FacebookLogIn facebookLogIn;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;

    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        googleLogIn = new GoogleLogIn();
        facebookLogIn = new FacebookLogIn();

        findViewById(R.id.google).setOnClickListener(this);
        findViewById(R.id.facebook).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);

        Profile profile = Profile.getCurrentProfile();


        textView = (TextView) findViewById(R.id.textView);

        if(profile!=null)
        textView.setText(profile.getFirstName());
        //textView.setText(Boolean.toString(isLoggedIn()));

        mAuth = FirebaseAuth.getInstance();


        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    TextView textView = (TextView) findViewById(R.id.textView);
                    textView.setText(user.getUid());
                } else {
                }

            }
        };

    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.google:
                Intent intent = new Intent(MainActivity.this, GoogleLogIn.class);
                intent.putExtra("SignState", 1);
                startActivityForResult(intent, 100);
                break;

            case R.id.facebook:
                Intent intent2 = new Intent(MainActivity.this, FacebookLogIn.class);
                intent2.putExtra("SignState", 1);
                startActivityForResult(intent2, 102);
                break;

            case R.id.button2:
                Intent intent1 = new Intent(MainActivity.this, GoogleLogIn.class);
                intent1.putExtra("SignState", 0);
                startActivityForResult(intent1, 101);
                break;

            case R.id.button3:
                Intent intent3 = new Intent(MainActivity.this, FacebookLogIn.class);
                intent3.putExtra("SignState", 0);
                startActivityForResult(intent3, 103);
                break;

        }
    }


    /**
     * Dispatch incoming result to the correct fragment.
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


        if (requestCode == 100) {

            if(resultCode==RESULT_CANCELED)
            {
                textView.setText("Failed");
            }

        } else if (requestCode == 101) {

            if(resultCode==RESULT_OK)
            {
                textView.setText("Signed Out");
            }

        } else if (requestCode == 102) {

            if(resultCode==RESULT_CANCELED)
            {
                int result = data.getIntExtra("Result",0);
                if(result==1)
                {
                    textView.setText("FB Cancelled");
                }
                if(result==2)
                {
                    textView.setText("FB Error");
                }

            }

            if (resultCode==RESULT_OK)
            {
                textView.setText(data.getStringExtra("Id"));
            }

        } else if (requestCode == 103) {

            if(resultCode==RESULT_OK)
            {
                textView.setText("Signed Out");
            }

        }
    }


    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }


    public boolean isLoggedIn() {
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        return accessToken != null;
    }
}
 

Активность в Facebook —

 package com.example.firebasesignin;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.appevents.AppEventsLogger;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResu<

/**
 * Created by Dawn on 10/13/2016.
 */

public class FacebookLogIn extends AppCompatActivity {

    CallbackManager callbackManager;
    int status;

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


        Intent intent = getIntent();
        status = intent.getIntExtra("SignState", 0);


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


        if (status == 1) {
            signIn();
        }
        if (status == 0) {
            signOut();
        }


    }

    public void signIn() {

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

                        String id = loginResult.getAccessToken().getUserId();
                        Intent data1 = new Intent();
                        data1.putExtra("Result", 0);
                        data1.putExtra("Id",id);
                        setResult(RESULT_OK, data1);
                        finish();
                    }

                    @Override
                    public void onCancel() {
                        Intent data1 = new Intent();
                        data1.putExtra("Result", 1);
                        setResult(RESULT_CANCELED, data1);
                        finish();
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        Intent data1 = new Intent();
                        data1.putExtra("Result", 2);
                        setResult(RESULT_CANCELED, data1);
                        finish();
                    }
                });
    }

    public void signOut() {
        FacebookSdk.sdkInitialize(getApplicationContext());
        LoginManager.getInstance().logOut();


        Intent data1 = new Intent();
        data1.putExtra("Result", 0);
        setResult(RESULT_OK, data1);
        finish();
    }

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

Ответ №1:

пожалуйста, попробуйте установить «Режим песочницы» на «ВЫКЛ» в «Основная информация» в настройках приложений Facebook, дайте мне знать, это работает для вас или нет?

Комментарии:

1. Sry Я не упоминал об этом, это тоже не помогло.

2. Я смог войти в систему один раз отлично, но во второй раз я этого не делаю

Ответ №2:

Я определил, что, во-первых, белый экран моего приложения, а не facebook, во-вторых, он не возвращается к MainActivity, потому что обратный вызов с Facebook не обрабатывается Callbackmanager.

Итак, покопавшись в Интернете, я нашел soultion

При использовании LoginManager для запуска обратного вызова регистра мы должны добавить перед ним еще одну строку кода

LoginManager.getInstance().logInWithReadPermissions(WelcomeActivity1.this, (Arrays.asList(«public_profile», «user_friends», «user_birthday», «user_about_me», «email»)));

Соответствующим образом измените разрешения на чтение, которые вам требуются.