it-swarm.com.de

In der Android-App wird das Google-Anmeldungs-Popup nicht geladen

Immer wenn ich versuche, mich durch Starten der Google-Anmeldeabsicht anzumelden, wird direkt an onActivityResult weitergeleitet, ohne dass ich die Möglichkeit habe, ein Konto auszuwählen. Alles, was Sie tun, ist den Bildschirm zu dimmen, aber das Fenster zum Auswählen eines Kontos wird nicht angezeigt wird nicht angezeigt ..__ Die Anmeldung schlägt dann mit dieser ApiException fehl: 

Java.lang.ClassNotFoundException: com.google.Android.gms.common.api.Scope

und

Java.lang.RuntimeException: Canvas: trying to draw too large(256000000bytes) bitmap.

(vollständiger Stack-Trace: https://Pastebin.com/vBZeBLu0 )

Alle meine verwendeten Abhängigkeiten sind auf dem neuesten Stand und meine Anmeldeinformationen (oAuth-Client-ID) sind alle korrekt eingerichtet. Ich habe die Lösung anderer ähnlicher Probleme ausprobiert, aber keiner von ihnen löste mein Problem. Ich überprüfte auch, ob der Benutzer abgemeldet ist vollständig aus dem Gerät und das Problem wurde ständig behoben.

Dies ist meine Login-Aktivität:

public class Login extends Activity implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks  {                                   

private static final String TAG = "LoginProcess";

SignInButton gsignInButton;
private static final int RC_SIGN_IN = 1;
DatabaseReference mRef;
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
GoogleSignInOptions gso;
GoogleApiClient mGoogleApiClient;


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

    mAuth = FirebaseAuth.getInstance();



    gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

    gsignInButton = findViewById(R.id.sib);

    gsignInButton.setColorScheme(SignInButton.COLOR_DARK); // wide button style
    gsignInButton.setOnClickListener(myhandler);


}

View.OnClickListener myhandler = new View.OnClickListener() {
    public void onClick(View v) {
       signIn();
    }

};



public 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);

    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);  //this is where it always lands.
            Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show();
            // ...
        }
    }

}

vollständiger Code für die Login-Aktivität: https://Pastebin.com/6Yi7vzD7

Gradle:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'

    defaultConfig {
        applicationId "com.example.sanchez.worldgramproject"
        minSdkVersion 21
        targetSdkVersion 28
        multiDexEnabled true
        versionCode 0
        versionName "0"


    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
        }
    }
}



dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])
    api "com.google.Android.material:material:1.0.0"

    implementation 'com.github.madrapps:pikolo:1.1.6'
    implementation 'com.google.Android.gms:play-services-drive:16.0.0'
    implementation 'com.google.Android.material:material:1.1.0-alpha02'
    implementation 'com.github.bumptech.glide:glide:3.8.0'
    implementation'com.firebaseui:firebase-ui-storage:2.3.0'
    implementation 'com.google.firebase:firebase-auth:16.1.0'
    implementation 'com.google.Android.gms:play-services-auth:16.0.1'
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.jakewharton:butterknife:8.8.1'
    implementation 'androidx.multidex:multidex:2.0.1'
    implementation 'pl.droidsonroids.gif:Android-gif-drawable:1.2.6'
    implementation 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.exifinterface:exifinterface:1.0.0'
    implementation 'com.google.firebase:firebase-storage:16.0.5'
    implementation 'com.google.Android.gms:play-services-maps:16.0.0'
    implementation 'com.google.firebase:firebase-database:16.0.5'
    testImplementation 'junit:junit:4.12'

}


apply plugin: 'com.google.gms.google-services'

Ich habe keine Ahnung, was die Ursache des Problems ist. Wie kann ich dieses Problem lösen und das Fenster für die Kontoauswahl aufklappen lassen?

EDIT 2.1.2019

Anstelle der obigen ApiExeption erhalte ich diesen Fehler:

W/LoginProcess: Google sign in failed
    com.google.Android.gms.common.api.ApiException: 8: 
        at com.google.Android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source:4)
        at com.google.Android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source:8)
        at com.example.sanchez.worldgramproject.Login.onActivityResult(Login.Java:162)
        at Android.app.Activity.dispatchActivityResult(Activity.Java:7548)
        at Android.app.ActivityThread.deliverResults(ActivityThread.Java:4485)
        at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:4532)
        at Android.app.ActivityThread.-wrap20(Unknown Source:0)
        at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1752)
        at Android.os.Handler.dispatchMessage(Handler.Java:105)
        at Android.os.Looper.loop(Looper.Java:164)
        at Android.app.ActivityThread.main(ActivityThread.Java:6938)
        at Java.lang.reflect.Method.invoke(Native Method)
        at com.Android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.Java:327)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1374)

Ich glaube, dass etwas mit meiner oAuth-Einstellung fehlgeschlagen ist (von Firebase automatisch generiert).

3
Ale4303

Option 1 - Stellen Sie sicher, dass die Google-Anmeldung in den Firebase-Authentifizierungsmethoden in der Firebase-Konsole aktiviert ist. Die Google-Anmeldung ist standardmäßig nicht aktiviert.

Option 2 - Fügen Sie in Ihrer AndroidManifest.xml-Datei unter dem Tag die folgenden Zeilen hinzu, um Unterstützung für hohen Speicher zu unterstützen, falls das Google-Anmeldungs-Popup mehr Speicher benötigt. Selbst große Bilder können mit diesem Befehl in das Anwendungs-Tag - _ ​​largeHeapals _ ​​true ~ Ihr Startbild geladen werden.

<application
    Android:hardwareAccelerated="true"
    Android:largeHeap="true" >

Option 3 - Verwenden Sie diesen Code, um die Google-Anmeldung mit Firebase zu implementieren. Es sollte funktionieren.

public class LoginActivity extends AppCompatActivity {

private GoogleSignInClient mGoogleSignInClient;
private FirebaseAuth mAuth;
private int permissions = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    SignInButton authButton = findViewById(R.id.home_auth_button);
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken("xxxxxxxxxxxx.apps.googleusercontent.com").requestEmail().build();
    mAuth = FirebaseAuth.getInstance();
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
    authButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            signIn();
        }
    });
}

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

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            GoogleSignInAccount account = task.getResult(ApiException.class);
            if (account != null) {
                firebaseAuthWithGoogle(account);
            } else{
                Log.w("AUTH", "Account is NULL");
                Toast.makeText(LoginActivity.this, "Sign-in failed, try again later.", Toast.LENGTH_LONG).show();
            }
        } catch (ApiException e) {
            Log.w("AUTH", "Google sign in failed", e);
            Toast.makeText(LoginActivity.this, "Sign-in failed, try again later.", Toast.LENGTH_LONG).show();
        }
    }
}

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d("AUTH", "firebaseAuthWithGoogle:" + 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("AUTH", "signInWithCredential:success");
                        startActivity(new Intent(LoginActivity.this, AnotherActivity.class));
                        Toast.makeText(LoginActivity.this, "Sign-in successful!", Toast.LENGTH_LONG).show();
                    } else {
                        Log.w("AUTH", "signInWithCredential:failure", task.getException());
                        Toast.makeText(LoginActivity.this, "Sign-in failed, try again later.", Toast.LENGTH_LONG).show();
                    }
                }
            });
    }
}

Suchen Sie nach dem GoogleSignInOptions.Builder, an dem Sie das requestIdToken ("xxxx") mit dem Builder übergeben müssen. Dies ist eine URL, die Sie auf der Registerkarte Firebase-Authentifizierung finden -> Anmeldemethoden -> Google -> Web-SDK-Konfiguration -> Web-Client-ID.

 requestIdToken Web Client ID

Hoffe, das beantwortet deine Frage.

Wie erwartet, lag dies daran 

Canvas: Versuch, ein zu großes Bitmap (256000000Byte) zu zeichnen.

Das von Ihnen verwendete Startsymbol, das auch im Dialogfeld für die Kontoauswahl angezeigt wurde, hat das Popup-Dialogfeld gestoppt.
Als Lösung können Sie der Antwort von Praveen (option2) folgen, wie die App die größeren Bilder von Manifest unterstützt.
Ich empfehle Ihnen jedoch, die Image-Datei zu komprimieren, da der Dialog zur Kontoauswahl nicht wirklich ein hochauflösendes Image benötigt und auch das Startsymbol nicht so groß sein muss. Sehen Sie sich " this " an, skalieren Sie die Startsymbole auf diese Größen (nur die Sie benötigen) und legen Sie sie in die entsprechenden Zeichenordner, sodass Sie in Zukunft ähnliche Probleme vermeiden können.

3
Niraj Niroula

Bitte fügen Sie den folgenden Code im Manifest hinzu

<meta-data
            Android:name="com.google.Android.gms.version"
            Android:value="@integer/google_play_services_version" />

Und versuchen Sie, die (hochauflösende) Splash-Bitmap von drawable nach drawable-xxhdpi zu verschieben, war die Lösung.

Ich hatte das gleiche Problem. Ich hatte nicht den Verdacht, dass mein Startbildschirm das Problem ist, da es beim Starten der App angezeigt wird. Es stellte sich jedoch heraus, dass der Startbildschirm das Problem ist.

Der Begrüßungsbildschirm in meinem Fall hat eine xxhdpi-Auflösung, und er wurde versehentlich im drawable-Ordner anstelle von drawable-xxhdpi abgelegt. Dies führte dazu, dass Android davon ausging, dass der Begrüßungsbildschirm eine Auflösung von mdpi aufwies und das Bild auf die dreifache Größe skalierte und versuchte, eine Bitmap zu erstellen.

verwenden Sie die Bitmap.Factory-Klasse. Dieser Link hilft Ihnen Große Bitmaps effizient laden

0
Viral Patel