В Android приложении Google Sign-In всплывающее окно не загружается - PullRequest
0 голосов
/ 29 декабря 2018

Всякий раз, когда я пытаюсь войти, запустив намерение входа в Google, он напрямую переходит к onActivityResult, и у меня нет возможности выбрать аккаунт.Все, что он делает, это затемняет экран, но окно для выбора учетной записи не появляется.После этого происходит сбой входа в систему с этим ApiException:

java.lang.ClassNotFoundException: com.google.android.gms.common.api.Scope

и

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

(трассировка полного стека: https://pastebin.com/vBZeBLu0)

Все мои использованные зависимости обновленыи мои учетные данные (oAuth client-id) все настроены правильно, я пробовал решения других подобных проблем, но ни одна из них не решила мою проблему, я также проверил, вышел ли пользователь полностью из устройства и проблема продолжала восстанавливаться.

Это мой вход в систему:

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();
            // ...
        }
    }

}

полный код для входа в систему: 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'

Я понятия не имею, в чем причина проблемы, как я могу решить эту проблему и сделать всплывающее окно выбора учетной записи?

РЕДАКТИРОВАТЬ 2.1.2019

Вместо этогоИз вышеперечисленного ApiExeption я получаю эту ошибку:

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)

Я считаю, что что-то пошло не так с тем, как я настроил мой oAuth (автоматически сгенерированный Firebase)

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Как и ожидалось, это произошло из-за

Холст: попытка нарисовать слишком большой (256000000 байт) растровый рисунок.

Значок средства запускато, что вы использовали, что также появилось в диалоговом окне выбора учетной записи, не давало диалоговому окну всплыть.
В качестве решения вы можете следовать ответу Правина ( option2 ) о созданииприложение поддерживает большие изображения из Manifest.
Но я предлагаю вам сжать файл изображения, потому что диалоговое окно выбора учетной записи на самом деле не требует изображения с высоким разрешением и ни один значок запуска не должен быть таким большим.Взгляните на этот , масштабируйте значки запуска до тех размеров (только те, которые вам нужны) и поместите их в соответствующие папки для рисования, чтобы это могло помочь вам избежать подобных проблем и в будущем.

0 голосов
/ 04 января 2019

Опция 1 - Убедитесь, что вход в Google включен в методах аутентификации Firebase в консоли Firebase.По умолчанию вход в Google не включен.

Параметр 2 - В вашем файле AndroidManifest.xml под тегом добавьте следующие строки для поддержки высокой памяти в случае, если знак Google- во всплывающем окне требуется больше памяти. Даже большие изображения могут быть загружены с помощью этой команды в теге приложения - largeHeap как true ~ ваше изображение запуска в этом случае.

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

Вариант 3 - попробуйте этот код для реализации входа в Google с помощью Firebase, и он должен работать.

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();
                    }
                }
            });
    }
}

Найдите GoogleSignInOptions.Builder, гдевам нужно передать requestIdToken ("xxxx") вместе с компоновщиком.Это URL, который вы можете найти на вкладке Аутентификация Firebase -> Методы входа -> Google -> Конфигурация Web SDK -> Идентификатор веб-клиента.

requestIdToken Web Client ID

Надеюсь, что это ответ на ваш запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...