#android #facebook
#Android #Facebook
Вопрос:
Пытаюсь войти в систему с помощью facebook, но каждый раз получаю белый экран (работает нормально только при первом входе в систему)
- 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»)));
Соответствующим образом измените разрешения на чтение, которые вам требуются.