Cześć jestem nowy w rozwoju Android. Obecnie próbuję zbudować podstawową aplikację Android z Firebase Google jako jego system backend.

Mam przycisk "Zaloguj się z Facebook", gdy tylko ten przycisk zostanie kliknięty, otwiera okno dialogowe, w którym użytkownik wprowadza swoje poświadczenia na Facebooku, aby uzyskać dostęp do aplikacji. Kiedy to zrobione, chcę przechowywać jego e-mail, nazwisko i identyfikator w Firebase, jeśli jest to jego pierwszy raz logując się, jeśli nie jest jego pierwszym logowaniem, chcę zaktualizować swoje informacje.

Zrobiłem klasę o nazwie Użytkownik (Pusto), którego użyję do reprezentowania tych danych. Moim problemem jest to, że nie wiem, gdzie umieścić kod, który przechowuje te informacje. Oto moja klasa taaktywności:

public class MainActivity extends AppCompatActivity {

    //Declare our view variables
    private LoginButton mLoginButton;
    private CallbackManager mCallbackManager;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private FirebaseDatabase mDatabase;
    private DatabaseReference mDatabaseReference;

    private static final String TAG = "MainActivity";

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

        //Initialize callback manager
        mCallbackManager = CallbackManager.Factory.create();

        //Assign the views to the corresponding variables
        mLoginButton = (LoginButton) findViewById(R.id.login_button);

        //Assign the button permissions
        mLoginButton.setReadPermissions("email", "public_profile");

        //Create instance of database
        mDatabase = FirebaseDatabase.getInstance();
        mDatabaseReference = mDatabase.getReference();

        //Assign the button a task
        mLoginButton.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);
            }
        });

        // Initialize Firebase Auth
        mAuth = FirebaseAuth.getInstance();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                //Get currently logged in user
                FirebaseUser user = firebaseAuth.getCurrentUser();

                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());

                    // Name, email address
                    String name = user.getDisplayName();
                    String email = user.getEmail();

                    // The user's ID, unique to the Firebase project. Do NOT use this value to
                    // authenticate with your backend server, if you have one. Use
                    // FirebaseUser.getToken() instead.
                    String uid = user.getUid();

                    //Create user
                    final User loggedIn = new User(uid, name, email);

                    mDatabaseReference.child("users").child(loggedIn.getId()).setValue(loggedIn);

                    mDatabaseReference.child("users").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            // This method is called once with the initial value and again
                            // whenever data at this location is updated.

                        }

                        @Override
                        public void onCancelled(DatabaseError error) {
                            // Failed to read value
                            Log.w(TAG, "Failed to read value.", error.toException());
                        }
                    });

                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
            }
        };
    }

    @Override
    protected 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);
        }
    }

    //If user successfully signs in the LoginButton's onSuccess callback method
    // get an access token for the signed-in user, exchange it for a Firebase credential
    // and authenticate with Firebase using the Firebase credential

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

        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, 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.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
}

Oto moja klasa użytkownika:

public class User {
    private String id;
    private String name;
    private String email;

    public User(){

    }

    public User(String id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

Dziękuję za Twój czas

0
mrhallak 15 luty 2017, 22:01

2 odpowiedzi

Najlepsza odpowiedź

I obniżył FireBase do 9.6.0, aby uniknąć błędów usług Google Play i zaoszczędziłem użytkownikowi po podpisaniu swoich poświadczeń w metodę rasterfacebookadokenokoken.

0
mrhallak 19 luty 2017, 18:57

Zrobiłeś już najbardziej pracę, więc zamierzam utworzyć dwie metody.

protected void getUserInfo(final LoginResult login_result){

    GraphRequest data_request = GraphRequest.newMeRequest(
            login_result.getAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(
                        JSONObject object,
                        GraphResponse response) {
                    try {
                        String facebook_id = object.getString("id");
                        String f_name = object.getString("name");
                        String email_id = object.getString("email");
                        String token = login_result.getAccessToken().getToken();
                        String picUrl = "https://graph.facebook.com/me/picture?type=normal&method=GET&access_token="+ token;

saveFacebookCredentialsInFirebase(login_result.getAccessToken());

                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
    Bundle permission_param = new Bundle();
    permission_param.putString("fields", "id,name,email,picture.width(120).height(120)");
    data_request.setParameters(permission_param);
    data_request.executeAsync();
    data_request.executeAsync();
}

Tutaj zapisujesz dane w Firebase

private void saveFacebookCredentialsInFirebase(AccessToken accessToken){
  AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(!task.isSuccessful()){
                Toast.makeText(getApplicationContext(),"Error logging in", Toast.LENGTH_LONG).show();
            }else{
               Toast.makeText(getApplicationContext(),"Login in Successful", Toast.LENGTH_LONG).show();  
            }
        }
    });    
}
1
SimpuMind 18 luty 2017, 13:42