Da steige ich gerade nicht so ganz durch. Die Zeit an sich funktioniert ja. Also an dem Screenshot siehst du ja das es bei jedem Benutzer die gestoppte Zeit dann gleich anzeigt. Heißt soweit funktioniert es ja. Zusätzlich zu dem die Zeit angezeigt wird wird es ja in eine Map gespeichert. Mithilfe dieser Map wird dann Später die Zeit berechnet.
Da ja die Zeit immer richtig angezeigt wird kann es daran ja garnicht liegen... Oder?
Beiträge von Kurmuro
-
-
System.currentTimeMillis() wird Local gemacht. Was hätte es für einen Vorteil die Serverzeit zu benutzen? Die Teilnehmer stoppen kann sowieso nur eine einzige Person später heißt das Problem mit Zeitmanipulationen vom Benutzer selbst wird nicht passieren.
-
ja das habe ich schon verstanden. wird denn auch noch von wo anders estwas in die Db geschrieben.
In dem Zusammenhang ist das das einzige wo in die Datenbank geschrieben wird.
Es gibt noch die Funktion generell Benutzer anzulegen aber das hat absolut garnichts damit zu tun.
In dieser Klasse werden nur diese Spezifischen werte abgerufen, verrechnet und dann in die Datenbank geschrieben. -
ok schaue ich mir an heut ist es mir zu spät.
wo welche Adresse auf github?
Nicht abschrecken lassen. Da das meine erste App ist ist vieles in deinen Augen wohl noch recht seltsam geschrieben xD.
Falls irgendetwas unklar ist einfach fragen.Ps.: Richtig fettes Dankeschön das du dir die Zeit nimmst um mir bei dem Problem zu helfen. Hab schon so viel getestet und in google findet man nichts über so einen Fehler deshalb weiß ich mir echt nicht mehr zu helfen.
-
Den ValueEventListener() benötigen wir in der Zeitberechnung um die gestoppte Zeit mit einem Benutzerspezifischen wert zu verrechnen. Heißt damit holen wir uns den dazugehörigen wert. Verrechnen ihn. Sortieren die Zeiten. Je nachdem wer erste usw. ist gibt es verschiedene punktzahlen die dann mit
Javafor (String key : alleUser.keySet()) { mDatabase.child("regatten").child(Integer.toString(regatten+1)).child("1").child(key).setValue(alleUser.get(key)); }
hochgeladen werden.
Damit das für jeden Teilnehmer gemacht wird geht er dabei die gesamte Liste durch. -
Wenn es hilft könntest du dir das Projekt auf GitHub anschauen, allerdings da es mittlerweile doch recht umfassend ist, ist es wohl recht verwirrend xD.
Der Timer ist ausschließlich dafür da die Zeit anzuzeigen, siehe oben rechts auf dem Bild. Zudem Speiern wir da die "System.currentTimeMillis()" in die variable start ab um später bei den einzelnen Teilnehmern ihre gestoppte zeit auszurechnen. Also um später einfach zu sagen wir drücken auf zeit stoppen dann wird System.currentTimeMillis() - start gemacht. -
Das Thread.sleep() war nur versehnentlich noch drin vom austesten wie man den Fehler beheben kann. Hatte die Hoffnung das die Datenbank die Teilnehmer nur nicht schnell genug abspeichern kann.
Wie gesagt werden die Teilnehmer alle einzelt gestoppt und in eine Map gespeichert. Dann gibt es einen finish button der mit einem Dialog abfragt ob man sich sicher ist.
Sobald man auf ja drückt wird Zeitberechnung gestartet.
Der Dialog wird wiederum aufgerufen durch ein OnClickListener aufgerufen. -
Hallo,
Erstmal danke für deine Antwort.
Da ich noch recht neu in der Materie bin, bin ich mir recht unsicher ob das wirklich mit Thread gemeint ist...
Wir benutzen einen "Timer" der unsere Systemzeit nimmt und dadurch berechnet wie viele Sekunden bisher vergangen sind.
Das ist in meiner Sicht recht unabhängig vom Hochladen der Punkte.Java
Alles anzeigenpublic void startStoppuhr() { final String[] secondString = new String[3]; if (!timerisrunning) { if (checked != null) { start = System.currentTimeMillis(); btnStartTime.setText("Abbrechen"); timerisrunning = true; stoppuhr.schedule(new TimerTask() { @Override public void run() { final long longseconds = (System.currentTimeMillis() - start) / 1000; final int a = (int) longseconds; final int stunden = a / 3600; final int minuten = (a % 3600) / 60; final int sekunden = (a % 3600) % 60; secondString[0] = Integer.toString(sekunden); if (sekunden <= 9) { secondString[0] = "0" + sekunden; } secondString[1] = Integer.toString(minuten); if (minuten <= 9) { secondString[1] = "0" + minuten; } secondString[2] = Integer.toString(stunden); if (stunden <= 9) { secondString[2] = "0" + stunden; } runOnUiThread(new Runnable() { @Override public void run() { timeview.setText(secondString[2] + ":" + secondString[1] + ":" + secondString[0]); } }); } }, 0, 1000); } } else { regattaAbbrechen(); } }
Das Grundprinzip von unserer App besteht darin Teilnehmer in eine Liste hinzuzufügen, den Timer zu starten, die Teilnehmer welche im Ziel ankommen sind zu stoppen (zeit wird in eine Map gespeichert), wenn alle gestoppt wurden wird die Zeit in punkte umgerechnet (funktioniert in dem wir alle zeiten in eine Liste einfügen und sortieren lassen), danach gehen wir die gesammte Liste durch und tragen es in die Datenbank ein. Hier der Code welcher es berechnet und dann hochladen soll.Java
Alles anzeigenprivate void zeitBerechnung(int runde) { for(String e : userLastTime.keySet()) { zeitTabelle.put(e, userLastTime.get(e).get(runde-1)); } final Map<String, Integer> unsortMap = new HashMap<>(); for (boolean e :checked){ if(e){ auswahlAnzahl++; } } for(final Map.Entry e : zeitTabelle.entrySet()){ if(!e.getValue().toString().equals("00:00:00")) { //mit dem yardstick berechnen mDatabase.child("users").child(e.getKey().toString()).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { int yardstickDb = Integer.parseInt(dataSnapshot.child("Yardstick").getValue().toString()); int zeitInSekunden; int berechneteYardstickzeit; String numbers = e.getValue().toString(); String[] split = numbers.split(":"); zeitInSekunden = Integer.parseInt(split[2]); zeitInSekunden += Integer.parseInt(split[1])*60; zeitInSekunden += Integer.parseInt(split[0])*60*60; berechneteYardstickzeit = (zeitInSekunden*100)/yardstickDb; berechnungsZähler++; unsortMap.put(e.getKey().toString(),berechneteYardstickzeit);//hilfe //berechnung fertig if (berechnungsZähler >= auswahlAnzahl){ Map<String, Integer> sortedMap = sortByValue(unsortMap); int i = 0; for (String key : sortedMap.keySet()) { i++; if (i == 1){ alleUser.put(key, 0.); } if(i == 2){ alleUser.put(key, 3.); } if(i == 3){ alleUser.put(key, 5.7); } if(i == 4){ alleUser.put(key, 8.); } if(i == 5){ alleUser.put(key, 10.); } if(i == 6){ alleUser.put(key, 11.7); } if(i >= 7){ alleUser.put(key, i+6.); } } //bei neue Regatta if(auswahl.equals("Neue Regatta")){ for (String key : alleUser.keySet()) { mDatabase.child("regatten").child(Integer.toString(regatten+1)).child("1").child(key).setValue(alleUser.get(key)); } regattaAbbrechen(); } //Bei Neuer Lauf else if(auswahl.equals("Neuer Lauf")){ mDatabase.child("regatten").child(Integer.toString(regatten)).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { lauf = 0; Iterator<DataSnapshot> dataSnapshots = dataSnapshot.getChildren().iterator(); while (dataSnapshots.hasNext()) { DataSnapshot dataSnapshotChild = dataSnapshots.next(); lauf++; } for (String key : alleUser.keySet()) { try{ Thread.sleep(600); }catch(InterruptedException e){} mDatabase.child("regatten").child(Integer.toString(regatten)).child(Integer.toString(lauf+1)).child(key).setValue(alleUser.get(key)); } regattaAbbrechen(); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } } }
-
Hallo, ich habe folgendes Problem bei meiner App...erst einmal die grundlegende Funktion, die App soll für verschiedene Benutzer jeweils eine Punktzahl in einer Firebase Datenbank Speichern.
Jetzt mein Problem es werden nicht immer alle Punktzahlen übertragen. Ich habe die App auf mehreren Handys ausprobiert, bei manchen geht es Problemlos bei manchen nicht (alle Android 9 und alle die selbe Appversion). Hat jemand eine Idee ob es an der App oder vlt auch an der Datenbank liegen kann? Oder wie ich diesen Fehler eingrenzen kann?...denn sobald der Debugger in Androidstudio aktiviert ist
funktioniert alles. Ich wäre sehr Dankbar für jeden noch so kleinen VorschlagMFG
Marcel -
Code vom Adapter:
Java
Alles anzeigenclass MyListAdapter extends ArrayAdapter<String> { int layout; List<String> object; List<String> useduserid; public MyListAdapter(@NonNull Context context, int resource, @NonNull List<String> objects, List<String> usedusersid) { super(context, resource, objects); layout = resource; object = objects; useduserid = usedusersid; } @NonNull @Override public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { ViewHolder mainViewHolder; if(convertView == null){ LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(layout, parent, false); final ViewHolder viewHolder = new ViewHolder(); //initalisieren viewHolder.name = convertView.findViewById(R.id.regatta_name); viewHolder.time = convertView.findViewById(R.id.regatta_timer); viewHolder.btnRundeHinzufügen = convertView.findViewById(R.id.rundeHinzufügen); viewHolder.btnRundeEntfernen = convertView.findViewById(R.id.rundeEntfernen); viewHolder.rundeTV = convertView.findViewById(R.id.rundeTV); viewHolder.btnClear = convertView.findViewById(R.id.btnClearTime); viewHolder.btnStop = convertView.findViewById(R.id.btnTimeStop); //ID und Name des Spielers eintragen viewHolder.id = useduserid.get(position); viewHolder.name.setText(object.get(position)); //Jeder Spieler der teilnimmt bekommt die Zeit von Runde eins auf null gesetzt viewHolder.lastTime.add(0, "00:00:00"); //Wenn der Spieler in der Map existiert: // HashMap<String, Boolean> userclickable = new HashMap<>(); if(Regatta.userclickable.get(viewHolder.id) != null) { //Wenn der Spieler schon gestoppt wurde trage es im Viewholder ein if (!Regatta.userclickable.get(viewHolder.id)) { viewHolder.editable = false; } } //String Array für die Zeit final String[] secondString = new String[3]; //Zeitberechnung wenn der Spieler gestoppt wurde viewHolder.btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Wenn die Zeit gestartet wurde und der Benutzer nicht schon gestoppt wurde if(Regatta.timerisrunning && viewHolder.editable) { Toast.makeText(getContext(), "Teilnehmer " + object.get(position) + " im Ziel", Toast.LENGTH_SHORT).show(); //die Sekunden werden umgerechnet im Stunden, Minuten und Sekunden final long longseconds = (System.currentTimeMillis() - Regatta.start)/1000; final int a = (int)longseconds; final int stunden = a / 3600; final int minuten = (a % 3600) / 60; final Integer sekunden = (a % 3600) % 60; secondString[0] = Integer.toString(sekunden); if(sekunden <=9) { secondString[0] = "0" + sekunden; } secondString[1] = Integer.toString(minuten); if(minuten <=9) { secondString[1] = "0" + minuten; } secondString[2] = Integer.toString(stunden); if(stunden <=9) { secondString[2] = "0" + stunden; } //Umgerechnete Zeit String timestamp = secondString[2]+":"+secondString[1]+":"+ secondString[0]; //Gestoppte Zeit wird dem Benutzer angezeigt viewHolder.time.setText(timestamp); //Benutzer soll nicht versehendelich mehrfach Gestoppt werden können viewHolder.editable = false; Regatta.userclickable.put(viewHolder.id,false); //Speichere die Zeit viewHolder.lastTime.set(viewHolder.runde - 1, timestamp); Regatta.userLastTime.put(viewHolder.id, viewHolder.lastTime); }else if(!viewHolder.editable){ Toast.makeText(getContext(), "Teilnehmer wurde schon gestoppt", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getContext(), "Du musst zuerst die Zeit Starten", Toast.LENGTH_SHORT).show(); } } }); //Neue Runde hinzufügen viewHolder.btnRundeHinzufügen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //wenn die Zeit gestartet wurde if (Regatta.timerisrunning) { //abfrage ob die momentane Runde schon gestoppt worden ist if (!viewHolder.lastTime.get(viewHolder.runde - 1).equals("00:00:00")){ //wenn das die letzte runde war füge eine neue runde hinzu mit dem wert null if (viewHolder.zurückGedrückt == 0) { viewHolder.lastTime.add(viewHolder.runde, "00:00:00"); viewHolder.editable = true; //falls das nicht die letzte runde war } else { viewHolder.zurückGedrückt--; } //ändere die angezeigte runde und zeige den wert der "neuen" runde an viewHolder.runde++; viewHolder.rundeTV.setText("Rnd: " + viewHolder.runde); viewHolder.time.setText(viewHolder.lastTime.get(viewHolder.runde -1)); }else{ Toast.makeText(getContext(), "Du musst zuerst die Zeit Stoppen", Toast.LENGTH_SHORT).show(); } } } }); //Gehe zur vorherigen runde viewHolder.btnRundeEntfernen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Es dürfen keine negativen runden möglich sein if(viewHolder.runde > 1) { //zeige die vorherige runde an, spieler darf nicht editierbar sein viewHolder.runde--; viewHolder.rundeTV.setText("Rnd: "+ viewHolder.runde); viewHolder.zurückGedrückt++; viewHolder.editable = false; viewHolder.time.setText(viewHolder.lastTime.get(viewHolder.runde -1)); } } }); //Lösche die Genommene Zeit viewHolder.btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //darf nur in der ersten oder letzten runde gelöscht werden. (alles löschen oder nur die letzte runde) if (viewHolder.zurückGedrückt == 0 || viewHolder.runde == 1) { viewHolder.time.setText("00:00:00"); viewHolder.editable = true; Regatta.userclickable.put(viewHolder.id, null); viewHolder.lastTime.set(viewHolder.runde - 1, "00:00:00"); Regatta.userLastTime.put(viewHolder.id, viewHolder.lastTime); } //wenn es die erste runde ist, werden die anderen runden auch gelöscht. if(viewHolder.runde == 1){ viewHolder.lastTime.clear(); viewHolder.lastTime.add(0, "00:00:00"); Regatta.userLastTime.put(viewHolder.id, viewHolder.lastTime); viewHolder.zurückGedrückt = 0; } } }); convertView.setTag(viewHolder); } else{ mainViewHolder = (ViewHolder) convertView.getTag(); mainViewHolder.name.setText(getItem(position)); } return convertView; } } class ViewHolder{ TextView name, time, rundeTV; Button btnStop, btnClear, btnRundeEntfernen, btnRundeHinzufügen; //Ist der Spieler editierbar (Wurde die Zeit schon für den Spieler gestoppt?) Boolean editable = true; //ID des Spielers String id; //Die gespeicherten Runden Zeiten List<String> lastTime = new ArrayList<>(); //die momentan angezeigte Runde int runde = 1; //Wie oft wurde zurückgedrückt (welche Runde wird momentan angezeigt) int zurückGedrückt = 0; }
-
Hallo,
ich weiß momentan nicht mehr weiter und finde im Internet auch keine passende Lösung. Bzw weiß ich auch nicht so ganz nach was ich suchen muss.
Hoffentlich kann mir hier einer helfen bzw einen Lösungsvorschlag geben.
(Ist meine erste App deshalb verzeiht wenn das in euren Augen eventuell etwas wirr ist xD)App funktion:
Ein Schiedsrichter wählt zwischen den vorhanden Benutzern aus welche an einem Wettlauf teilnehmen. Dann kann er die Zeit einzelner Runden stoppen. Am Ende wird geschaut welcher Teilnehmer die niedrigste runde hat (z.b. runde 3). Dann wird von allen Mitspielern die Zeit aus Runde 3 gewertet.
Screenshot:
Gelöst wurde das indem ich eine ListView benutze um die ausgewählten Teilnehmer anzuzeigen. Dabei gebe ich dem Adapter mit welche Benutzer alle ausgewählt wurden und deren UUIJavaListView list = findViewById(R.id.auswahlliste); list.setAdapter(new MyListAdapter(Regatta.this, R.layout.regatta_items, users, usersid));
Hatte damals eine tolle Anleitung gefunden und das hat super geklappt.
Jetzt soll allerdings erreicht werden das falls z.b. einer zu spät kommt dieser Spieler nachträglich hinzugefügt wird, genauso sollen spieler auch entfernt werden können. Jetzt führe ich meinen oben geschriebenen Code aus, mit der geänderten user Liste.Wie verhindere ich das die vorherigen werde gelöscht werden?
Ich verzweifel schon ewig an dem Problem
Falls fragen offen sind einfach fragen. -
Nach sowas hatte ich glaub ich gesucht, mal reinlesen wie das funktioniert xD
Meine Grundidee bestand darin mir die Möglichkeit offen zu lassen dem normalen Benutzer später eventuell später komplett andere Sachen anzeigen zu lassen ohne groß etwas ändern zu müssen. Sowas wie ein paar aktuelle Neuigkeiten etc, die weiß der admin ja sowieso heißt bei ihm können da ruhig knöpfe sein
Aber ich glaub die Idee verwerfe ich wieder und mach es wie du meintest über die Sichtbarkeit. Hab ja genug Platz für weitere Buttons die ihm die neuigkeiten zeigen.
Danke
-
Wäre eine Option aber z.b. der Header zieht sich fast durch die ganze App. Bisher ist es so gelöst das ich ein header.xml erstellt hab, dieses dann in den gewünschten layouts includiert habe und in jeder dazugehörigen Activity den dazugehörigen Code einfach reinkopiert habe.
Hat den Nachteil an sich das wenn ich am Header z.b. eine funktion hinzufügen will das in jeder einzelnen Activity ändern darf.
Ist extrem Zeitaufwendig und fehleranfällig... nacher vergisst man es versehendlich bei Activity x von 18....Ich kann mir nicht vorstellen das es da keine sauberere Lösung gibt xD
-
Hallo,
ich hab eine ganz grundlegende Frage, kurz gesagt weiß ich bin sicher das es dafür eine schöne Möglichkeit gibt aber weiß nicht wie bzw weiß nichtmal nach was genau ich googlen muss...Je nachdem welche Rechte ein Benutzer hat soll er eine andere Startseite haben (mehr oder weniger auswahlmöglichkeiten angezeigt bekommen).
Dafür würde ich einfach unterschiedliche Layouts nutzen und je nachdem anzeigen lassen.Allerdings soll jeder Benutzer unter den Buttons eine Rangliste angezeigt bekommen. Auch der Header ist bei jedem gleich bis auf das sein eigener Name angezeigt wird.
Wär ja unschön jetzt z.b. bei der Activity für den Admin die Berechnung der Rangliste und die möglichkeiten vom Header immer in die jeweiligen Activitys der untergeordneten zu kopieren.Gibt es da die Möglichkeit einfach ein Layout für den Header und eins für die Rangliste zu erstellen die ich dann nurnoch auf meiner Startseite einbinden muss?
Wie würdet ihr das machen bzw benutzen?
-
Hallo,
Wie oben im Titel schon steht führt Java mir den Code falschrum aus...
Was passiert:
Man wählt aus einer Liste mehrere Teilnehmer aus -> addUserstoList() wird aufgerufen und die IDs der gewählten Teilnehmer werden übergeben.Im nächsten Schritt soll aus einer Datenbank der Name geholt werden und in eine andere Liste hinzugefügt werden.
Java
Alles anzeigen//Ausgewählte Benutzer in Liste einfügen public void addUserstoList(final List<String> usersid){ //Datenbank Reference herstellen DatabaseReference UserRef = FirebaseDatabase.getInstance().getReference(); UserRef.keepSynced(true); //Teilnehmerliste erstellen <vorname+nachname> final List<String> users = new ArrayList<>(); //Für jeden ausgewählten Benutzer Vor und Nachname in users abspeichern for(String i:usersid){ UserRef.child("users").child(i).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { //Wenn auf Datenbank zugegriffen werden kann: StringBuffer buffer = new StringBuffer(); buffer.append(dataSnapshot.child("Vorname").getValue().toString()+ " "); buffer.append(dataSnapshot.child("Nachname").getValue().toString()); users.add(buffer.toString()); System.out.println("test1"+" "+ users); } @Override public void onCancelled(DatabaseError databaseError) { //Wenn ein Fehler auftritt: } }); } System.out.println("test2"+" "+ users); //User Liste eintragen ListView list = findViewById(R.id.rangliste); list.setAdapter(new MyListAdapter(this, R.layout.regatta_items, users, usersid)); }
Wenn ich das jetzt so ausführe zeigt es mir im Logcat erst mein test2 an allerdings ist die Liste leer.
Danach Zeigt es mir die Teilnehmer, also nachdem es die Liste ja schon erstellt hat.System.out: test2 []
System.out: test1 [max muster]
System.out: test1 [max muster, test test]
System.out: test1 [max muster, test test, vorname nachname]Woran Liegt das? Und wie kann ich Java sagen das es erst die Teilnehmer in die Liste einfügt und es dann erst angezeigt wird?
Wenn irgendwas fehlt einfach fragen
-
Hallo,
erstmal erkläre ich die gewünschte Funktion in meiner App:
Also, es gibt einen Login Screen auf dem man sich anmelden kann. (Keine Möglichkeit zu registrieren, neue Benutzer werden vom Admin verwaltet)
Jetzt soll der Benutzer je nachdem ob er Admin rechte hat die möglichkeit haben Benutzer hinzufügen/ändern/löschen zu können (wird warscheinlich an einfachsten sein in der Datenbank für jeden Benutzer ein boolean zu erstellen mit dem man dann abfragt ob Benutzer isAdmin true ist, oder gibt es eine effizientere möglichkeit?)Das mit dem anmelden klappt einwandfrei (bis jetzt gibt es noch keine admin abfrage, noch kann es jeder machen)
Das erste Problem auf das ich gestoßen bin ist das sobald ich sage "mAuth.createUserWithEmailAndPassword(email, passwort);" loggt es meinen aktuellen benutzer aus und meldet sich mit dem eben erstellten Benutzer an.
Laut Google Recherche gibt es keine möglichkeit das automatische einloggen zu verhindern, ich muss mich erneut einlogen... Um mich erneut einzulogen muss ich allerdings das Passwort mit angeben.
Bedeutet ich müsste entweder den Admin sich jedesmal neu einloggen lassen (was bei so 50 neuen teilnehmern extrem nervig ist) oder ich muss das Passwort irgendwie bekommen.
Problem ist nur das Firebase mir keine Möglichkeit bietet es zu bekommen..
Ich bin das ganze jetzt so umgangen das das Passwort anfangs beim login lokal gespeichert wird. Da gibt es doch bestimmt schönere lösungsmöglichkeiten oder?Das nächste große Problem ist so ähnlich:
Sobald jetzt ein Benutzer gelöscht werden soll geht er die Datenbank durch, zeigt sie an und der angeklickte Benutzer wird gelöscht...
So die Theorie, denn man kann anscheinend nur den currentUser löschen
Heißt ich muss mich erst mit dessen Benutzerdaten anmelden. Hier hab ich nicht die möglichkeit das passwort lokal zu speichern sondern müsste es mit in der datenbank speichern... keine gute idee wie mir scheint...Eine angeblich andere Möglichkeit die es eventuell gibt, es gibt die funktion mAuth.signInWithCustomToken allerdings um so einen Token zu erstellen muss man irgendwie ein admin sdk implementieren.
Die Tutorials die es dazu gibt bringen mir nichts, da jagt ein Fehler den nächsten...
Wobei ich mir da eh nicht sicher bin ob das am ende dann funktioniert.Wie würdet ihr das anstellen? (Bitte einfach erklären, bin noch recht neu in der Materie )