Habe es gerade mit dem new ausprobiert (sowohl mit dem Code von oben als auch mit einem selbst geschriebenem). Leider geht es trotzdem nicht. Ich glaube ich habe da irgendeine Verknüpfung zwischen Google und meiner App vergessen. Ich bin jetzt aber eigentlich schon mehrere Male verschiedenste Tutorials zu den Verknüpfungen durchgegangen und habe keinen Fehler gefunden.
Beiträge von Timer
-
-
Hi, du hast auch keine richtige Instanz GoogelSignInOption mit new erstellt.
https://developers.google.com/…y/sign-in/android/sign-inCode
Alles anzeigen// 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) .requestEmail() .build(); // Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso); // Check for existing Google Sign In account, if the user is already signed in // the GoogleSignInAccount will be non-null. GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); updateUI(account);
Das mit der Instanz muss man doch gar nicht tun oder? Das ist doch eine Funktion oder nicht? https://developers.google.com/…ignin/GoogleSignInOptions
Das ist (so hört sich das für mich an und habe ich auch im Internet gelesen) für ein Google Login Button.
Ich würde jedoch ganz gerne in meinem Spiel einen Google Play Spiele Login machen, denn ich glaube, dass man nur mit einem Google Play Spiele Login ein Real-Time-Multiplayer einrichten kann oder?auserdem ist die Variable GoogleSignIn noch gar nicht erstellt zu dem zeitpunkt der if abfrage.
in etwa so.
Code
Alles anzeigenprivate boolean isSignedIn() { GoogleSignInClient signInClient2 = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); return singnInClient2.getLastSignedInAccount(this) != null; } private void signInSilently() { if(!isSignedIn()) { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { GoogleSignInAccount signedInAccount = task.getResult(); } else { startSignInIntent(); } } }); } }
oder erstelle signInClient global.
Das sollte doch so reichen wie ich das habe oder nicht? Dein Code funktioniert bei mir leider nicht (obwohl ich den Schreibfehler bei dem return rausgemacht hab). Da steht dann bei getLastSignedInAccount "Cannot resolve method 'getLastSignedInAccount(de. ... .SignIn)'"
Wenn ich signInClient gloabal erstelle und beim return rein mache, kommt der gleiche Fehler wie zuvor -
Ich habe jetzt einfach mal eine isSignedIn Abfrage zuvor geschaltet. Bringt leider trotzdem nichts:
Code
Alles anzeigenprivate boolean isSignedIn() { return GoogleSignIn.getLastSignedInAccount(this) != null; } private void signInSilently() { if(!isSignedIn()) { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { GoogleSignInAccount signedInAccount = task.getResult(); } else { startSignInIntent(); } } }); } }
-
Danke das hat sehr geholfen.
Leider ist es immer noch gleich:- Der Hintergrund verdunkelt sich
- Der Google Play Spiele Ladescreen und das Logo öffnen sich
- Das Logo schließt sich wieder
- Der Bildschirm bleibt verdunkelt und es öffnet sich ein leeres PopUp im Hintergrund
Woran kann das sonst noch liegen? Ich bisher folgendes gemacht, um meine App für das Sign In von Google Play hinzubekommen:
- Verknüpfte Apps (Android App eingestellt)
- AndroidMainfest.xml editiert
- ids.xml editiert
- google-services.json erstellt
Hab ich da irgendwas vergessen?
EDIT:
Mir ist gerade aufgefallen, dass bei signInSilently "<GoogleSignInAccount>" steht. Muss ich das ersetzen oder kann ich das so lassen?EDIT2:
Ich woltle gerade nachschauen, ob bei signin_other_errors ein Code ausgegeben wird. Dabei ist mir aufgefallen, dass dort zwar ein int hinterlegt ist, jedoch wird dieser nicht an message übergeben (message sit danach 0). Woran liegt das?
signin_other_errors ist 2131427382 -
Ich habe gerade gelesen, dass ich nun jedes Mal eine signed APK erstellen muss, damit die SIgn In Funktion funktioniert. Leider finde ich, anders als bei den Tutorials, die ich im Internet finde, keine Keystore Datei. Muss man die vorab erstellen oder wo ist die zu finden/wie kann ich die bekommen?
-
Ja den Account habe ich erstellt. Client ID und Projekt auch.
Und danke habe die File in den Samples übersehen. Ich habe die nun nachgetragen und nun kommt auch ein grüner Ladescreen (grüner kreisförmiger Ladebalken) und dann ein Google Play Spiele Bild. Leider wird das nach kurzem Laden abgebrochen und der Bildschirm wird wieder dunkel und es erscheint die leere Fehlermeldung (PopUp mit nichts drin)
Ich habe nun noch einmal breakpoint gemacht und nun einen Wert für resultCode bekommen. Der ist nun 0 -
Sorry habe ich vergessen. Mir wird der Wert von resultCode aus irgendeinem Grund nicht angezeigt (alle anderen Variablen und Werte werden mir unten schön aufgelistet).
Ich bin nun noch einmal alle Tutorials u.ä. durchgegangen, um zu schauen, ob ich irgendetwas vergessen habe hinzuzufügen. Ich habe nun bemerkt, dass ich folgendes Tutorial noch nicht aufgeführt habe (der Link war klein aufgeführt, als ich die OAuth2-Client-ID hinzugefügt habe):
https://developers.google.com/…t#step_3_modify_your_code
Leider gibt es bei mir keine ids.xml und ich weiß auch nicht wie ich die hinzufüge. Soll ich da eine einfach xml Calue Datei erstellen? Und was gehört da alles rein? -
ne ich werde zu keiner Anmeldung weitergeleitet
-
Ok danke. Dann habe ich dafür schon einmal ne Erklärung. Leider ist (schätzungsweise, da in der Zeile "startActivityForResult..." der Fehler liegt) dann der Intent "intent" falsch. Hast du ne Idee, woran das liegen kann?
-
Ich habe gerade bemerkt, dass es daran liegt, dass RC_SIGN_IN nichts zugewiesen wird. Leider finde ich auch nichts im Internet dazu. Was muss ich dem zuweisen?
EDIT:
Ich habe jetzt gefunden, dass ich für RC_SIGN_IN zuvor "private static final int RC_SIGN_IN = 9001;" schreiben muss. Leider ist anscheinend noch bei der Variable intent etwas falsch. Bisher habe ich den Fehler jedoch noch nicht gefunden -
Fail. Das onCreate habe ich zuvor wohl aus versehen rausgelöscht.
Nun wird der Hintergrund wenigstens blau angezeigt (wie festgelegt). Leider wird der Bildschirm immer noch nach kurzer Zeit dunkler. Was ich zuvor vergessen hab zu schreiben: wenn ich irgendwo auf den Bildschirm drücke, kommt ein PopUp mit keiner Inschrift und einem Ok Button.
Ich habe nun in jede Zeile einen Breakpoint gepackt. Leider, wenn ich bei der letzten auszuführenden Zeile weiter drücke, erscheint erst der Bildschirm und wird dann nach ~0,5s dunkler.
Die Datei hab ich drin -
Ok das habe ich nun auch geschafft
Nun habe ich das Problem, dass nach dem starten der App auf meinem Handy nach ca 0,5 Sekunden der Bildschirm grau wird (alles außer oben die Leiste mit Uhrzeit usw.)
Woran liegt das? Ich habe im Internet nichts vergleichbares gefunden.
Mein Code:Code
Alles anzeigenimport android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; 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.auth.api.signin.GoogleSignInResult; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; public class SignIn extends AppCompatActivity { int RC_SIGN_IN; private void signInSilently() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { GoogleSignInAccount signedInAccount = task.getResult(); } else { startSignInIntent(); } } }); } private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { GoogleSignInAccount signedInAccount = result.getSignInAccount(); } else { String message = result.getStatus().getStatusMessage(); if (message == null || message.isEmpty()) { message = getString(R.string.signin_other_error); } new AlertDialog.Builder(this).setMessage(message) .setNeutralButton(android.R.string.ok, null).show(); } } } @Override protected void onResume() { super.onResume(); signInSilently(); } }
-
Die oben genannten Stellen sind rot markiert und unterstrichen.
Die Dependencies direkt habe ich nicht hinzugefügt, jedoch habe ich unter File --> Project Structure -->Authentication --> ✓
Dort stehtZitatEnabling this service will...
-Add dependencies: com.google.android.gms:play-service-auth: 11.8.0
Das sollte doch reichen oder?
-
Hey,
ich muss nochmal was fragen:
Ich habe nun den Code von dem Silent Sign-In Teil kopiert und bei mir eingefügt. Leider bekomme ich jetzt bei allen GoogleSignInClient, GoogleSignIn, GoogleSignInOptions usw folgenden Fehler:
"Cannot resolve symbol 'GoogleSignInOptions'" (bzw am Schluss die jeweilige Funktion (heißt sowas so überhaupt?))
Ich habe nun im Internet gesucht und nichts gefunden, was hilft.
Ist mein foglender Code eigentlich richtig oder muss ich da noch irgendwas hinzufügen? Sollte eigentlich momentan nur der Code von dem Google Tutorial sein:Code
Alles anzeigenpackage de.[name].[game]; import android.support.v7.app.AppCompatActivity; public class SignIn extends AppCompatActivity { private void signInSilently() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.silentSignIn().addOnCompleteListener(this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { GoogleSignInAccount signedInAccount = task.getResult(); } else { // Player will need to sign-in explicitly using via UI } } }); } @Override protected void onResume() { super.onResume(); signInSilently(); } }
-
-
Ich habe dies jetzt testweise mit meiner eigenen Datenbank ausprobiert und einfach ein paar Hundert Berechnungen eintragen lassen. Das war leider, wie erwartet, nicht sehr effizient.
Ich werde nun einfach die Daten auf den Handys berechnen lassen und an die anderen Spieler weitersenden lassen.Ich wollte jetzt erstmal einen Google Play Service Login in meiner App machen. Dafür habe ich folgende Anleitung von Google gefunden:
https://developers.google.com/games/services/android/signin
Leider bin ich mir da nicht sicher, ob ich die Silent Sign-In Variante oder die interactive Sign-In Variante benutzen soll.
Ich habe dazu auch keine wirklichen Unterschiede gefunden.
Wo liegt der Unterschied?
Oder habe ich das falsch verstanden und es sind keine zwei Varianten, sondern es muss beides in die App? -
Ich habe mich jetzt noch ein bisschen mehr eingelesen und bemerkt:
- Androids Real Time Multiplayer API tauscht nur Daten zwischen den Handys aus (da ist kein Server, der etwas berechnet, sondern nur einer, der weiterleitet)
- Über einen eigenen Server könnte ich das zwar machen, jedoch wäre das entweder nicht sehr effizient (z.B. über eine MYSQL Datenbank, in der die Daten immer berechnet werden und dann ausgelesen werden) oder über ein sehr kompliziertes Skript, was man für den Server ausführen müsste, was zur Folge hat, dass eine dauerhafte Verbindung zwischen den Usern stattfindet und sehr viel Rechenleistung eines Servers erfordert (um die ganzen Daten den richtigen Lobbys zuzuweisen und dann alles zu berechnen)
Ich mache die Berechnungen nun doch über das eigene Handy und tausche diese nur über Real Time Multiplayer mit den anderen Spielern aus.
-
Bei dem oben gepostetem Link steht, dass man real time Multiplayer aktivieren muss. Wenn man da drauf klickt, kommt ein Tutorial, wie man das anmacht. Dort steht "1. Open the Game Services page...". Wenn ich das im Internet suche kommt folgende Seite:
https://developers.google.com/games/services/
Dort steht ein Link zur Aktivierung. Wenn man den anklickt, kommt ein Formular, wo man 25$ zahlen muss. -
ok dann werde ich wohl um die 25$ nicht drum rum kommen. Weiß jemand, ob die Server bei Google, die man dafür braucht extra kosten? Oder brauche ich da auch einen eigenen Server?
-
Hey,
ich hoffe die Frage passt noch zu den Anfängerfragen.
Da es viel zu lange dauern würde euch meine Spiele Idee vorzustellen stelle ich es einfach sehr sehr stark vereinfacht dar:
Es gibt 8 Spieler. Jeder Spieler bekommt jede 30 min zufällig viel Geld (welche Menge wird vom Server bestimmt und an denjenigen Spieler weitergeleitet). Dieses Geld kann er jederzeit ausgeben. Wenn er diese ausgibt, soll dies an einen Server gesendet werden. Dieser soll dann einen Wert ausrechnen und der wird dann an alle 8 Spieler weitergegeben.
Ich hätte dies jetzt mit Androids vorgefertigten Real-time Multiplayer gemacht (https://developers.google.com/…droid/realtimeMultiplayer ), nur leider weiß ich nicht, wie gut das Spiel wird und ich will nicht vorab 25$ ausgeben, um Google Play Console beitreten zu können. Kann ich das irgendwie (einigermaßen einfach) ohne Google Play Console (nur über eigene Server) umsetzen?MfG
Timer