2016-06-06 7 views
9

जब मैं अपने Google खाते से साइन इन करता हूं और getDisplayName() के साथ नाम प्राप्त करता हूं, तो मेरा नाम सही ढंग से दिखाई देता है, लेकिन AuthStateListener में नहीं।firebaseAuth.getCurrentUser() वापसी नल DisplayName

यहां मेरे कोड का हिस्सा:

private void handleSignInResult(GoogleSignInResult result) { 

    Alert.dismissProgress(); 

    if (result.isSuccess()) { 
     GoogleSignInAccount acct = result.getSignInAccount(); 

     if(acct != null) { 
      Log.i("NAME", acct.getDisplayName()); <-- RETURN MY NAME CORRECTLY 
      credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
      fuser.linkWithCredential(credential).addOnCompleteListener(authResult);      
     } else { 
      //ERROR 
     } 

    } else { 
     //ERROR 
    } 
} 

लेकिन मेरे AuthStateListener

@Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
     FirebaseUser nuser = firebaseAuth.getCurrentUser(); 

     if (nuser != null) { 

      Log.i("NAME", nuser.getDisplayName()); <--- RETURN NULL 
     } 
    } 

किसी में पता वजह से ऐसा हो सकता है?

उत्तर

6

इस के बाद से यह दस्तावेज में तो स्पष्ट नहीं है एक मुश्किल से एक है ...

के रूप में यहां बताए गए getProviderData()

की जाँच करें: https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser#public-method-summary

आप उस सूची पुनरावृति कर सकते हैं और इसमें उस खाते से जुड़े सभी प्रदाता होंगे, जिसमें प्रदाता के साथ प्रदाता शामिल है Id = "google.com" डिस्प्ले नाम = YOUR_GOOGLE_USERNAME

मुझे बताएं कि क्या आप नहीं कर सकते यह

+0

धन्यवाद! getProviderData() मुझे 2 उपयोगकर्ता सूचनाएं लौटाता है, इसलिए मैं google.com जानकारी का चयन कर सकता हूं, लेकिन फिर भी अजीब है कि अगर मैं नए उपयोगकर्ता को लिंक करता हूं तो मुझे केवल नया उपयोगकर्ता दिखाना चाहिए, न कि दोनों ... लेकिन अभी भी काम करता है;) –

+0

हाँ मैंने कुछ फायरबेस अजीब सामान देखा है ..... उदाहरण के लिए आईओएस में अज्ञात कुंजी कस्टम प्रमाणीकरण के साथ अज्ञात = सत्य लौटाती है और अज्ञात प्रमाणीकरण के साथ एंड्रॉइड कस्टम = झूठी और अनाम = सत्य में – Ymmanuel

6

बस काम Ymmanuel के जवाब में जोड़ने के लिए बनाने के लिए एक त्वरित कॉपी और पेस्ट की तलाश में किसी और के लिए कुछ उदाहरण कोड के साथ (धन्यवाद!):

FirebaseUser user = firebaseAuth.getCurrentUser(); 
if (user != null) { 
    // User is signed in    
    String displayName = user.getDisplayName(); 
    Uri profileUri = user.getPhotoUrl(); 

    // If the above were null, iterate the provider data 
    // and set with the first non null data 
    for (UserInfo userInfo : user.getProviderData()) { 
     if (displayName == null && userInfo.getDisplayName() != null) { 
      displayName = userInfo.getDisplayName(); 
     } 
     if (profileUri == null && userInfo.getPhotoUrl() != null) { 
      profileUri = userInfo.getPhotoUrl(); 
     } 
    } 

    accountNameTextView.setText(displayName); 
    emailTextView.setText(user.getEmail()); 
    if (profileUri != null) { 
     Glide.with(this) 
       .load(profileUri) 
       .fitCenter() 
       .into(userProfilePicture); 
    } 
} 

ऊपर पहले प्रदर्शन नाम का उपयोग करने की कोशिश करेंगे और प्रदाताओं से फोटो यूआरएल अगर यह उपयोगकर्ता ऑब्जेक्ट में प्रारंभ में नहीं मिला था।

बोनस: छवियों के लिए ग्लाइड का उपयोग करना: https://github.com/bumptech/glide

0

मैं जब मैं था इस समस्या हो रही थी: के रूप में कहीं और सुझाव नहीं था user.getProviderData() के माध्यम से

compile 'com.google.firebase:firebase-auth:9.6.0' 
compile 'com.firebaseui:firebase-ui-auth:0.6.0' 

पुनरावृत्ति:

compile 'com.google.firebase:firebase-auth:10.0.0' 
compile 'com.firebaseui:firebase-ui-auth:1.0.1' 

का संभावित हल है कि यह मेरे लिए तय की जगह उस के साथ था इसे बाद के संस्करणों के लिए ठीक करें।

3

एडमंड जॉनसन सही है। यह मुद्दा फायरबेस एथ 9.8.0 में पेश किया गया था। एक वर्कअराउंड में 9.6.1 तक डाउनग्रेडिंग या 'री-लॉग इन' को मजबूर करना शामिल है क्योंकि उपयोगकर्ता लॉग आउट होने और लॉग इन करने के बाद जानकारी पॉप्युलेट हो जाती है। समस्या Firebase issue

पर बताया गया है यह फायरबेस के लिए एक बग के रूप में रिपोर्ट किया गया है फायरबेस यूआई योगदानकर्ताओं में से एक - एलेक्स सेवौ।

1

मैं एक ही मुद्दा कॉल FirebaseAuth.getInstance().signOut();, उन्हें प्रस्थान करने के लिए फिर पुन: प्रयास किया था, मैं उपयोगकर्ता प्रस्थान करने और उन्हें वापस इस्तीफा देने से इसे हल।

। जैसा कि मैंने पाया है, यह समस्या एक ही समय में ईमेल/पासवर्ड प्रमाणीकरण और सामाजिक लॉगिन (मेरे मामले में फेसबुक) का उपयोग करने के साथ आम है।

0

सबसे पहले मुझे कहना है कि ग्रैडल फ़ाइलों या लॉगआउट को डाउनग्रेड करने की आवश्यकता नहीं है और उपयोगकर्ता नाम को प्रदर्शित करने के लिए दूसरों द्वारा बताए गए कई बार लॉगिन करें। मैंने इस मुद्दे को एक अलग तरीके से हल किया है जबकि अभी भी नवीनतम ग्रैडल फाइलें रख रहे हैं और उपयोगकर्ता को कई बार लॉग इन नहीं करना है। getDisplayName() के साथ समस्या बहुत बड़ी है इसलिए मैं फ़ायरबेस के भविष्य के उपयोगकर्ताओं के लिए सिरदर्द छोड़ने के लिए जितना संभव हो उतना वर्णनात्मक होना चाहता हूं।

समाधान 1:

उपयोगकर्ताओं को, जो प्रमाणित (प्रवेश) इस तरह के फेसबुक, गूगल आदि और/या ईमेल/के रूप में कई प्रदाताओं के साथ के लिए

यहाँ समाधान के विवरण दिए गए हैं पासवर्ड जो उन्होंने साइन-अप पर बनाया था:

पहली चीज़ जो आप सुनिश्चित करना चाहते हैं वह यह है कि जब आपके पास पहली बार ऐप के साथ उपयोगकर्ता साइन-अप होता है तो आप अपना नाम अपने अद्वितीय रूप से डेटाबेस में संग्रहीत करते हैं आईडी। उपयोगकर्ता का नाम अपने Firebase डेटाबेस में संग्रहित किया गया है के बाद

// Method signature. Write current user's data to database 
private void writeNewUser(String userId, String name, String email) { 

DatabaseReference current_user_database = mDatabaseRef.child(userId); 

current_user_database.child("username").setValue(name); 

// Email here is not mandatory for the solution. Just here for clarity of the 
// method signature 
current_user_database.child("email").setValue(email); 

} 

और आप उन्हें अपने ऐप्लिकेशन में प्रवेश करें आप इस तरह अपने उपयोगकर्ता नाम कुछ प्राप्त कर सकते हैं: कुछ इस तरह लग सकता है कौन सा

// Method that displays the user's username 
    private void showUserName() { 

     // Get instance of the current user signed-in 
     mFirebaseUser = mAuth.getCurrentUser(); 

     // Check if user using sign-in provider account is currently signed in 
     if (mFirebaseUser != null) { 


      // Get the profile information retrieved from the sign-in provider(s) linked to a user 
      for (UserInfo profile : mFirebaseUser.getProviderData()) { 

        // Name of the provider service the user signed in with (Facebook, Google, Twitter, Firebase, etc.) 
        String name = profile.getDisplayName(); 


// If displayName() is null this means that the user signed in using the email and password they created. This is the null issue we shouldn't get that we are gonna be solving below. 
       if(name == null){ 

        mDatabaseRef.addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

// Get the name the user signed-up with using dataSnapshot 
          String nameOfCurrentUser = (String) dataSnapshot.child("name").getValue(); 

// Set username we retrieved using dataSnapshot to the view 
          mTestUsernameTextView.setTitle(nameOfCurrentUser); 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 

// If the name is not null that means the user signed in with a social Auth provider such as Facebook, Twitter, Google etc. 
       if(name != null) { 

        // Set the TextView (or whatever view you use) to the user's name. 
        mTestUsernameTextView.setText(name); 

       } 

      } // End for 

     } // End if 

    } 

है कि यह। अब आप उस विधि को showUserName() पर कॉल करें या जो कुछ भी आपकी विधि को आपके ऑनरेट के अंदर बुलाया जाएगा और उम्मीद है कि इससे मदद मिलती है।

समाधान 2:

उपयोगकर्ता जो आपके एप्लिकेशन में साइन इन तरह के फेसबुक, ट्विटर, गूगल या कोई अन्य विकल्प Firebase की अनुमति देता है के रूप में केवल एक सामाजिक मीडिया सेवा प्रदाता का उपयोग कर के लिए:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
if (user != null) { 
    for (UserInfo profile : user.getProviderData()) { 
     // Id of the provider (ex: google.com) 
     String providerId = profile.getProviderId(); 

     // UID specific to the provider 
     String uid = profile.getUid(); 

     // Name, email address, and profile photo Url 
     String name = profile.getDisplayName(); 
     String email = profile.getEmail(); 
     Uri photoUrl = profile.getPhotoUrl(); 
    }; 
} 

यह समाधान 2 के लिए है, बस इसके लिए फायरबेस पर दिशानिर्देशों का पालन करें और आपको अच्छा होना चाहिए। Get a user's profile information

मैं सच में आशा है कि यह getDisplayName() मुद्दे के साथ संघर्ष कर किसी को भी मदद करता है:

यहाँ यदि आप उत्सुक हैं यह करने के लिए एक कड़ी है।

निष्कर्ष:

यदि आपका ऐप्लिकेशन केवल फेसबुक, ट्विटर, गूगल या जो कुछ भी किसी और सोशल मीडिया साइन-इन विकल्पों में Firebase तो बस पर वर्तमान में उपयोगकर्ता के प्रवेश किए getDisplayName() विधि बुला दिखाने के लिए पर्याप्त होना चाहिए प्रदान करता है उनका उपयोगकर्ता नाम

अन्यथा यदि आपका ऐप उपयोगकर्ता द्वारा बनाए गए ईमेल/पासवर्ड का उपयोग करके साइन इन करने की अनुमति देता है तो सुनिश्चित करें कि आपको साइन-अप पर अपना नाम/उपयोगकर्ता नाम मिला है ताकि आप इसे बाद में प्रदर्शित करने के लिए इसका उपयोग कर सकें।

0

मुझे Firebase documentation में इस समस्या का समाधान मिला! समाधान का उपयोग कर उपयोगकर्ता प्रोफ़ाइल अद्यतन करने के लिए है: UserProfileChangeRequest:

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() 
         .setDisplayName(mUser.getName()) 
         .setPhotoUri(Uri.parse("https://example.com/mario-h-user/profile.jpg")) 
         .build(); 

      firebaseUser.updateProfile(profileUpdates) 
         .addOnCompleteListener(new OnCompleteListener<Void>() { 
          @Override 
          public void onComplete(@NonNull Task<Void> task) { 
           if (task.isSuccessful()) { 
            Log.d(TAG, "User profile updated."); 
           } 
          } 
         }); 

चर Muser पहले से ही क्षेत्रों से सामग्री से भरा है। मैं FirebaseAuth.AuthStateListener अंदर कोड के इस टुकड़े का इस्तेमाल किया() -> onAuthStateChanged()

0

यह समस्या firebase ui संकलन 'com.firebaseui के नवीनतम संस्करण में हल हो गई है: firebase-ui: 1.2.0 '

संबंधित मुद्दे