2016-08-21 1 views
1

Ich entwickle eine Android App, die Facebook Login verwendet. Die Anmeldung funktioniert einwandfrei und ich kann über Facebook Graph API-Aufrufe Informationen abrufen.Facebook SDK blockiert Upload von String zu Firebase

Ich versuche, eine Zeichenfolge in meine Firebase-Datenbank hochladen und die Zeichenfolge (Titel ParentFirstNameFromFacebook) ist der Vorname des Benutzers, der sich in Facebook anmeldete. Ich versuche schließlich, ein übergeordnetes Objekt mit parentFirstNameFromFacebook in seiner Methode setName() hochzuladen.

doneCreatingNameAndPasswordFAB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      gettingTextFromNameAndPasswordEditTexts(); 


      //region creating new Parent object and setting required variables 
      Parent coOpCreatingParent = new Parent(); 

      coOpCreatingParent.setCoopCreator(true); 
      coOpCreatingParent.setNumOfHoursOwned(0); 


      Bundle params = new Bundle(); 
      params.putString("fields", "id,first_name"); 
      new GraphRequest(AccessToken.getCurrentAccessToken(), "me", params, HttpMethod.GET, 
        new GraphRequest.Callback() { 
         @Override 
         public void onCompleted(GraphResponse response) { 

          if (response != null) { 
           try { 
            JSONObject data = response.getJSONObject(); 

            parentFirstNameFromFacebook = data.getString("first_name"); 

            SharedPreferences fBookSharedPref; 
            SharedPreferences.Editor editor; 

            fBookSharedPref = getSharedPreferences(Constants.FBOOK_NAME_SHARED_PREF, Context.MODE_PRIVATE); 
            editor = fBookSharedPref.edit(); 
            editor.putString(Constants.FBOOK_NAME_SHARED_PREF, parentFirstNameFromFacebook); 
            editor.apply(); 


           } catch (Exception e) { 
            e.printStackTrace(); 
           } 
          } 
         } 
        }).executeAsync(); 



      SharedPreferences fBookSharedPref = getSharedPreferences(Constants.FBOOK_NAME_SHARED_PREF, Context.MODE_PRIVATE); 

      fbookFirstNameForUpload = fBookSharedPref.getString(Constants.FBOOK_NAME_SHARED_PREF, null); 


      coOpCreatingParent.setName(fbookFirstNameForUpload); 


      getProfileImageUrlFromFBookGraph(); 

      coOpCreatingParent.setImageUrl(parentImageIDFromFBookGraph); 


      ArrayList<Child> newChildArrayList = new ArrayList<>(); 

      coOpCreatingParent.setChildren(newChildArrayList); 


      //endregion 

      //region creating new ArrayList<Parent> adding Parent object from above 
      ArrayList<Parent> coOpParentArrayList = new ArrayList<>(); 
      coOpParentArrayList.add(coOpCreatingParent); 
      //endregion 

      getReferenceOfCoOpBeingCreated(); 

      //region uploading entire new Co-Op object to Firebase 
      CoOp coOpObjectBeingUploaded = new CoOp(coOpKey, enteredNewCoOpPassword, enteredNewCoOpName, coOpParentArrayList); 
      referenceOfCoOp.setValue(coOpObjectBeingUploaded); 
      //endregion 

      //region going to AddChildren Activity with Co-Op key in intent 
      Intent intentForNewActivity = new Intent(getBaseContext(), AddChildrenActivity.class); 
      intentForNewActivity.putExtra(Constants.CO_OP_REFERENCE_TO_CHILD_ACTIVITY_KEY, coOpKey); 
      startActivity(intentForNewActivity); 
      //endregion 


     } 
    }); 

Im Firebase Screenshot unten ist parentsInCoOp eine Arraylist und die 0 darunter ist das übergeordnete Objekt. Ich versuche, einen Namen und eine Facebook-URL-Zeichenfolge als andere Variablen für dieses Parent-Objekt festzulegen.

Firebase screenshot

Was immer ich tue, wird der Name zeigt nicht auf Firebase up! Ich bin mir nicht sicher, was ich falsch mache!

Ich habe auch versucht Shared Preferences für den Fall, dass ein Problem mit der Einstellung ParentFirstNameFromFacebook innerhalb der OnCompleted() -Methode von Facebook-Aufruf ist. Ich legte parentFirstNameFromFacebook in SharedPref und dann es heraus, um es über parent.setName() übergeben.

Sobald ich den Vornamen erfolgreich hochgeladen habe, dann mache ich den gleichen Prozess für die URL-Zeichenfolge fbook Bild.

Hat jemand einen Rat? Vielen Dank!

Antwort

1

Sie führen die Facebook-API GraphRequest mit der executeAsync()-Methode aus. Die Anforderung wird in einem separaten Thread verarbeitet, und die Antwort onComplete() wird asynchron empfangen. Ich benutze nicht die Facebook-API, aber rate die Anfrage erfordert Kommunikation mit den Facebook-Servern und wird viele Millisekunden benötigen, um eine Antwort zu liefern.

Das Ergebnis ist, dass diese Aussagen

fbookFirstNameForUpload = 
    fBookSharedPref.getString(Constants.FBOOK_NAME_SHARED_PREF, null); 
coOpCreatingParent.setName(fbookFirstNameForUpload); 

ausgeführt werden, bevor die Anweisungen in der Callback ausgeführt haben und den Namen in den Einstellungen gespeichert.

+0

Ahh, ich verstehe. So '.setName()' läuft, bevor die Facebook-Antwort ankommt. Das bedeutet, dass "fbookFirstNameForUpload" null ist, wenn '.setName()' ausgeführt wird .... weshalb ein Name nicht zu meinem Firebase hinzugefügt wird. Ich sollte in der Lage sein, nur 'setName (fbookFirstNameForUpload)' WITHIN 'onComplete()' Antwort, richtig? – langsmith

+0

@langsmith: Ja, Sie müssen den Code, der von der Facebook-Antwort abhängt, in den Rückruf verschieben oder ihn innerhalb des Rückrufs aufrufen. –