Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase Oauth Facebook无法在碎片中工作_Android_Facebook_Android Fragments_Firebase_Firebase Authentication - Fatal编程技术网

Android Firebase Oauth Facebook无法在碎片中工作

Android Firebase Oauth Facebook无法在碎片中工作,android,facebook,android-fragments,firebase,firebase-authentication,Android,Facebook,Android Fragments,Firebase,Firebase Authentication,使用Firebase Facebook进行身份验证不起作用,以下是我的片段代码: public class LoginFragment extends Fragment { private View mView; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private CallbackManager mCallbackManager; public LoginFrag

使用Firebase Facebook进行身份验证不起作用,以下是我的片段代码:

public class LoginFragment extends Fragment {

private View mView;

private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private CallbackManager mCallbackManager;

public LoginFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mView = inflater.inflate(R.layout.fragment_login, container, false);
    loginFacebook();
    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
                //Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                //Log.d(TAG, "onAuthStateChanged:signed_out");
            }
            // ...
        }
    };

    return mView;
}


private void loginFacebook() {
    // Initialize Facebook Login button
    mCallbackManager = CallbackManager.Factory.create();
    LoginButton loginButton = (LoginButton) mView.findViewById(R.id.login_button);
    loginButton.setReadPermissions("email", "public_profile");
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            //Log.d(TAG, "facebook:onSuccess:" + loginResult);
            handleFacebookAccessToken(loginResult.getAccessToken());
        }

        @Override
        public void onCancel() {
            //Log.d(TAG, "facebook:onCancel");
            // ...
        }

        @Override
        public void onError(FacebookException error) {
            //Log.d(TAG, "facebook:onError", error);
            // ...
        }
    });
}


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

    // Pass the activity result back to the Facebook SDK
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
}

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

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

private void handleFacebookAccessToken(AccessToken token) {
    //Log.d(TAG, "handleFacebookAccessToken:" + token);

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener((MainActivity)getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    //Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());

                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        //Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText((MainActivity)getActivity(), "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }


                }
            });
}
}
公共类LoginFragment扩展了片段{
私有视图;
私人消防队;
私有FirebaseAuth.AuthStateListener mAuthListener;
私有CallbackManager-mCallbackManager;
公共登录片段(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
mView=充气机。充气(R.layout.fragment\u登录,容器,false);
loginFacebook();
mAuth=FirebaseAuth.getInstance();
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
//Log.d(标记为“+user.getUid()”);
}否则{
//用户已注销
//Log.d(标记“onAuthStateChanged:signed_out”);
}
// ...
}
};
返回mView;
}
私有void loginFacebook(){
//初始化Facebook登录按钮
mCallbackManager=CallbackManager.Factory.create();
LoginButton LoginButton=(LoginButton)mView.findViewById(R.id.login_按钮);
setReadPermissions(“电子邮件”、“公共档案”);
registerCallback(mCallbackManager,newfacebookcallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
//Log.d(标签“facebook:onSuccess:+loginResult”);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@凌驾
公开作废{
//Log.d(标签“facebook:onCancel”);
// ...
}
@凌驾
public void onError(facebook异常错误){
//Log.d(标签“facebook:onError”,错误);
// ...
}
});
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
//将活动结果传回Facebook SDK
onActivityResult(请求代码、结果代码、数据);
}
@凌驾
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@凌驾
公共void onStop(){
super.onStop();
if(mAuthListener!=null){
removeAuthStateListener(mAuthListener);
}
}
私有无效handleFacebookAccessToken(AccessToken令牌){
//Log.d(标记“handleFacebookAccessToken:”+token);
AuthCredential credential=FacebookAuthProvider.getCredential(token.getToken());
mAuth.SIGNWITH凭证(凭证)
.addOnCompleteListener((MainActivity)getActivity(),新OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
//Log.d(标记“signInWithCredential:onComplete:+task.isSuccessful()”);
//如果登录失败,则向用户显示消息。如果登录成功
//将通知身份验证状态侦听器,并使用逻辑来处理
//可以在侦听器中处理已登录用户。
如果(!task.issusccessful()){
//w(标记“signInWithCredential”,task.getException());
Toast.makeText((MainActivity)getActivity(),“身份验证失败。”,
吐司。长度(短)。show();
}
}
});
}
}
Facebook弹出窗口出现后,我输入用户名和密码,在调试模式下,代码中没有任何内容会触发

Firebase用户总是null。我做错了什么? 登录后,它会记录Log.d(“LOGGER”,“onAuthStateChanged:signed_out”)


PS:当插入到MainActivity

中时,完全相同的代码可以工作。您可以尝试将片段链接到登录按钮

loginButton.setFragment(this);

所以经过一些研究,我现在知道我应该使用一个活动来进行登录操作,而不是一个片段

然而,我在MainActivity中使用代码时遇到了问题,实际上一切都“起作用”。我已登录,但我的FirebaseAuth.AuthStateListener没有从FirebaseAuth.getCurrentUser()返回任何用户

所以,经过几个小时的测试,我发现在登录方法中启用电子邮件/密码使其工作。奇怪的

至少我认为这是个问题,不过我确实做了一个新的Android项目。并使用:工具->firebase生成firebase项目。但正如我所记得的,这并没有解决问题,至少没有立即解决

也可能是因为模拟器


我只是从我的自定义按钮中调用facebook默认按钮,并将每一行代码都保留在文档中,然后它成功地工作了

private FirebaseAuth FirebaseAuth;
私有CallbackManager-mCallBackManager;
私人登录按钮登录按钮;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u sign\u in,container,false);
facebook=view.findviewbyd(R.id.facebook按钮);
loginButton=view.findviewbyd(R.id.facebookBtn);
firebaseAuth=firebaseAuth.getInstance();
facebook.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
callOnClick();
}
});
loginButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mCallBackManager=CallbackManager.Factory.create();
public class SignInFragment extends Fragment implements
> FragmentChangeListener{
>     private Button facebook;
private FirebaseAuth firebaseAuth;
private CallbackManager mCallBackManager;
private LoginButton loginButton;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.fragment_sign_in, container, false);

    facebook = view.findViewById(R.id.facebookButton);
    loginButton = view.findViewById(R.id.facebookBtn);

    firebaseAuth = FirebaseAuth.getInstance();

    facebook.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            loginButton.callOnClick();
        }
    });

    loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mCallBackManager = CallbackManager.Factory.create();
            loginButton.setFragment(SignInFragment.this);
            loginButton.setPermissions("email","public_profile");
            loginButton.registerCallback(mCallBackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    handleFacebookAccessToken(loginResult.getAccessToken());
                }

                @Override
                public void onCancel() {
                    Toast.makeText(getContext(),"Is Cancelled",Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(FacebookException error) {
                    Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG).show();
                }
            });
        }
    });

    return view;
}


@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    mCallBackManager.onActivityResult(requestCode, resultCode, data);

}

private void handleFacebookAccessToken(AccessToken token) {
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        FirebaseUser user = firebaseAuth.getCurrentUser();
                        startActivity(new Intent(getContext(),MainActivity.class));
                    } else {
                        // If sign in fails, display a message to the user.
                        Toast.makeText(getContext(), task.getException().getMessage(),
                                Toast.LENGTH_SHORT).show();
                    }

                }
            });
}