android - अगर उपयोगकर्ता पहली बार Firebase[डुप्लिकेट] में मुझे कैसे पता लगा सकता है




firebase-authentication (3)

अगर उपयोगकर्ता पहली बार फायरबेस में कैसे पता लगा सकता है?

यदि आप यह जांचना चाहते हैं कि उपयोगकर्ता पहली बार लॉग इन करता है या नहीं, यदि आप उपयोगकर्ता नए हैं तो यह वही है। तो इसे हल करने के लिए, आप अतिरिक्त रूप से कॉल कर सकते हैं अतिरिक्तउपयोगकर्ता के isNewUser() विधि:

लौटाता है कि उपयोगकर्ता नया है या मौजूदा

इस तरह OnCompleteListener.onComplete कॉलबैक में:

OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if (task.isSuccessful()) {
            boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
            if (isNewUser) {
                Log.d("TAG", "Is New User!");
            } else {
                Log.d("TAG", "Is Old User!");
            }
        }
    }
};

अधिक informations के लिए, कृपया आधिकारिक दस्तावेज देखें।

संपादित करें: इसे काम करने के लिए, आपको एक पूर्ण श्रोता जोड़ना होगा। कृपया नीचे कोड देखें:

mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
        if (isNewUser) {
            Log.d(TAG, "Is New User!");
        } else {
            Log.d(TAG, "Is Old User!");
        }
    }
});

या और भी सरल:

mAuth.signInWithCredential(credential).addOnCompleteListener(this, completeListener);

जिसमें, completeListener वस्तु वह वस्तु है जिसे पहले परिभाषित किया गया था।

मुझे यह जांचने की आवश्यकता है कि क्या उपयोगकर्ता पहली बार साइन इन कर रहा है, और यदि सही है तो अतिरिक्त गुणों (अंक, सदस्यता, आदि) के साथ अपने खाते को इनिशियलाइज़ करें।

उपयोगकर्ता अपना डिवाइस बदल सकता है और किसी अन्य डिवाइस पर फिर से लॉगिन करना चाहता है।

मैं Google साइन-इन विधि का उपयोग कर रहा हूं। मैंने कुछ इस तरह की कोशिश की।

if(FirebaseAuth.getInstance().getCurrentUser() != null){
                           Toast.makeText(Anamain.this, "Welcome again xyz", Toast.LENGTH_SHORT).show();
                       }

मैं नए खाते के साथ साइन-इन करता हूं, इसलिए पहली बार इस ऐप में, लेकिन यह वैसे भी "वेलकम फिर से xyz" संदेश दिखा रहा है।

यदि उपयोगकर्ता डेटाबेस पर पहले मौजूद है तो मैं कैसे पता लगा सकता हूं?

पूर्ण कोड

package com.mertg.testsignin;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;


import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.ConnectionResult;

import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.database.FirebaseDatabase;


public class Anamain extends AppCompatActivity {


    private String TAG = "Anamain";
    private SignInButton signIn;
    GoogleSignInClient mGoogleSignInClient;
    private int RC_SIGN_IN = 1;
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_anamain);

        signIn = (SignInButton)findViewById(R.id.googleBtn);

        mAuth = FirebaseAuth.getInstance();

        // Configure sign-in to request the user's ID, email address, and basic
// profile. ID and basic profile are included in DEFAULT_SIGN_IN.
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        signIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                signIn();
            }
        });


    }

    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

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

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                firebaseAuthWithGoogle(account);

            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                Log.w(TAG, "Google sign in failed", e);


                // ...
            }
        }
    }



    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d("TAG", "signInWithCredential:success" + acct.getId());

        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                       /* if (!task.isSuccessful()){
                        Log.d("TAG", "signInWithCredential:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                            updateUI(user);
                        }*/
                       if(FirebaseAuth.getInstance().getCurrentUser() != null){
                           Toast.makeText(Anamain.this, "Welcome again xyz", Toast.LENGTH_SHORT).show();
                       }

                       else {
                            //Log.w("TAG", "signInWithCredential:failure", task.getException());
                           // Toast.makeText(Anamain.this, "Basaramadim", Toast.LENGTH_SHORT).show();
                            //updateUI(null);
                           Toast.makeText(Anamain.this, "Register Successful", Toast.LENGTH_SHORT).show();
                           FirebaseUser user = mAuth.getCurrentUser();
                           //updateUI(user);
                        }

                    }


                });

    }

    private void updateUI(FirebaseUser user) {
        GoogleSignInAccount acct = GoogleSignIn.getLastSignedInAccount(getApplicationContext());
        if(acct != null)    {
            String personName = acct.getDisplayName();

            Toast.makeText(this, "Sen Girdin" + personName, Toast.LENGTH_SHORT).show();
        }
    }

}

अद्यतन करें

मुझे त्रुटि मिली: '' इस लाइन के लिए अपेक्षित है

mAuth.signInWithCredential(credential)

इस तरह से ı ने प्रतिस्थापित किया।

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d("TAG", "signInWithCredential:success" + acct.getId());

        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(authCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
                if (isNewUser) {
                    Log.d(TAG, "Is New User!");
                } else {
                    Log.d(TAG, "Is Old User!");
                }
            }

        });

    }

आप अपने डेटाबेस में user node रख सकते हैं, जिस पर आप uuid रूप में key जोड़ सकते हैं और इसके यूनीक uuid रूप में मान दे सकते हैं, यदि आपका उपयोगकर्ता पहली बार आता है तो आपको उपयोगकर्ता नोड पर uuid नहीं मिलेगा और इसलिए आप uuid जोड़ सकते हैं। डेटाबेस में आपका उपयोगकर्ता


बस नए उपयोगकर्ता के मुद्दे पर मेरे पिछले कार्यान्वयन को साझा करने के लिए।

मैंने अपने प्रोजेक्ट में Firebase Cloud Firestore का उपयोग किया है, इसलिए मैंने अपने उपयोगकर्ताओं की मूल जानकारी संग्रहीत करने के लिए एक और तालिका बनाई है।

सबसे पहले, मैं createUser() नाम से एक विधि createUser() , लेकिन मूल रूप से, यह जाँचता है कि क्या यह Firebase Cloud Firestore डेटाबेस को क्वेरी करके पहली बार उपयोगकर्ता है। यदि मौजूद नहीं है, तो उपयोगकर्ता के लिए एक दस्तावेज़ बनाएं, और आप उनके प्रति अपनी कार्रवाई कर सकते हैं, देख //you can add some action here नीचे दिए गए कोड में //you can add some action here

नीचे मेरी पिछली परियोजना के लिए वास्तविक कोड है जिसमें उपयोगकर्ता की पहुंच को नियंत्रित करने के लिए एक भूमिका-आधारित प्रशासन शामिल है (यदि आप रुचि रखते हैं तो केवल आपके संदर्भ के लिए)।

 public void createUser(){
        docRef = mFirestore.collection("users").document(auth.getCurrentUser().getUid());
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();

                   //if the user is already in the database, check the user role
                    if (document != null && document.exists()) {
                        User user = document.toObject(User.class);
                        if(user.getRoles().get("admin")==true){
                            Log.d(TAG, "Admin: true");
                            btn_admin.setVisibility(View.VISIBLE);
                        }

                        else{
                            Log.d(TAG, "Admin: false");
                            btn_admin.setVisibility(View.GONE);
                        }

                        Log.d(TAG, "DocumentSnapshot data: " + document.getData());
                    } else {
                         //check whether it's a new user
                         //if yes, create a new document containing the user details thru my User model

                        Log.d(TAG, "No such document");
                        btn_admin.setVisibility(View.GONE);
                        Map<String, Boolean> roles = new HashMap<>();
                        roles.put("editor", false);
                        roles.put("viewer", false);
                        roles.put("admin", false);
                        User user = new User(auth.getCurrentUser().getDisplayName(), auth.getCurrentUser().getUid(),auth.getCurrentUser().getEmail(), roles);
                        //you can add some action here

                        mFirestore.collection("users").document(auth.getCurrentUser().getUid())
                                .set(user, SetOptions.merge())
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Log.d(TAG, "DocumentSnapshot successfully written!");
                                    }
                                })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Log.w(TAG, "Error writing document", e);
                                    }
                                });
                        //Log.d(TAG, "Created credential");
                    }
                } else {
                    Log.d(TAG, "get failed with ", task.getException());
                }
            }
        });
    }




firebase-authentication