Google Войти не работает должным образом

У меня есть встроенный вход с Google в моем приложении для Android, теперь проблема заключается в том, что на каком-то устройстве его не работает, но в моем эмуляторе и на каком-то устройстве он работает нормально, в чем проблема?

https://developers.google.com/identity/sign-in/android/

http://www.androidhive.info/2014/02/android-login-with-google-plus-account-1/

эти два учебника для входа в систему, но когда я запускаю свое приложение и пытаюсь войти в него, он позволяет выбирать учетную запись, но когда я нажимаю на нее в своем logcat, он показывает

System.out: Google logout

CODE

private void handleSignInResult(GoogleSignInResult result) {
        Log.d("", "handleSignInResult:" + result.isSuccess());
        if (result.isSuccess()) {
            // Signed in successfully, show authenticated UI.
            GoogleSignInAccount acct = result.getSignInAccount();

            Log.e("", "display name: " + acct.getDisplayName());


            personName = acct.getDisplayName();
            personPhotoUrl = String.valueOf(acct.getPhotoUrl());
            ggoleemail = acct.getEmail();
            googleid = "G" + acct.getId();
          //  String baday = String.valueOf(acct.getAccount());

            Log.e(TAG, "Name: " + personName + googleid  + ", email: " + ggoleemail
                    + ", Image: " + personPhotoUrl);
          /*  txtName.setText(personName);
            txtEmail.setText(email);
            Glide.with(getApplicationContext()).load(personPhotoUrl)
                    .thumbnail(0.5f)
                    .crossFade()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(imgProfilePic);
*/
            googleslogins();
          //  updateUI(true);

        } else {
            // Signed out, show unauthenticated UI.
            //updateUI(false);
            System.out.println("Google logout");
        }
    }

Ответ 1

Добавили ли вы свой хэш сертификата на консоль разработчика Google и включили API в менеджере Google API?

API - GooglePlus и люди Api

Ответ 2

Прежде всего, необходимо проверить, правильно ли установлена ​​версия игровых сервисов google

public static boolean checkPlayServices(Activity context) {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(context);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                //apiAvailability.getErrorDialog(context, resultCode, 9000).show();
            } else {
                //show error message
            }
            return false;
        }
        return true;
    }

Убедитесь, что у вас есть правильный токен google. Убедитесь, что вы включили Google + Войдите в консоль Google

private void setupGoogle() {
        gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.google_token))
                .requestScopes(new Scope(Scopes.PLUS_ME))
                .requestEmail()
                .requestProfile()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                .enableAutoManage(getActivity(), this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .addOnConnectionFailedListener(this)
                .build();
    }

Вход триггера

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, Constant.GG_SIGN_IN);

onActivityResult

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Constant.GG_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                firebaseAuthWithGoogle(result.getSignInAccount());
                Logger.debug(new Gson().toJson(result.getSignInAccount()));
                Logger.debug(new Gson().toJson(result.getStatus()));
                //code here
            }
            else{
                Logger.shortToast("google sign-in failed");
            }
        }
    }

Ответ 3

Выполните следующие действия:

1. Создайте SHA1:

окна:

keytool -list -v -keystore "% USERPROFILE%.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

Mac и Linux:

keytool -list -v -keystore ~ ​​/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

2. Добавьте проект на консоль Google. Добавить сертификат, введя SHA1.

3. Включите google sigin из консоли firebase. Загрузите файл json.

4. Добавьте этот код в андроид:

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
    
    
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();
    
       
    
mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
    
    
       
    
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data)
        {
           super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN)
        {
            GoogleSignInResult result =   Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleSignInResult(result);
        }
       
    }

    private void handleSignInResult(GoogleSignInResult result)
    {
        Log.d("TAG", "handleSignInResult:" + result.isSuccess());
        if (result.isSuccess())
        {
            // Signed in successfully, show authenticated UI.
            GoogleSignInAccount acct = result.getSignInAccount();
            String email = acct.getEmail();
            String name = acct.getDisplayName();
            Uri phone = acct.getPhotoUrl();
            String photo = String.valueOf(phone);

            String[] user_name = name.split("\\s+");

            String fname = user_name[0];

            String lname =user_name[1];

            Log.d("email", email);
            Log.d("photo", photo);
            Log.d("u_name", name);
            Log.d("f_name", fname);
            Log.d("l_name", lname);

        }
    }

Ответ 4

Основываясь на этом thread, вы получаете ошибку, возможно, потому, что учетная запись пользователя прикреплена как к размещенной учетной записи, так и к учетной записи Google, и, вероятно, у него разные пароли для каждого. Серверы аутентификации в настоящее время не справляются с этим. Следуйте этому Подключение к Google Диску с помощью API-интерфейсов клиентской библиотеки API Google для Java.

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ...
   // Google Accounts using OAuth2
   m_credential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(DriveScopes.DRIVE));

   m_client = new com.google.api.services.drive.Drive.Builder(
            m_transport, m_jsonFactory, m_credential).setApplicationName("AppName/1.0")
            .build();
   ...
}

Вы также можете проверить эти связанные проблемы:

Надеюсь, это поможет!

Ответ 5

Есть несколько вещей, которые вы не делаете. Во-первых, вы теряете много информации о том, почему соединение не выполняется, потому что вы не проверяете причину сбоя соединения, входящего в параметр GoogleSignInResult...

private void handleSignInResult(GoogleSignInResult result) {
}

Чтение кодов состояния

Этот параметр содержит полезную информацию, которую вы игнорируете. Вы можете получить код состояния ошибки, если вход не выполнен успешно...

private void handleSignInResult(GoogleSignInResult result) {
    if(!result.isSuccess()){

        Status status = result.getStatus();
    }
}

С этим статусом вы можете проверить, почему сбой входа не удалось, проверив код состояния

int code = status.getStatusCode();

if(code == GoogleSignInStatusCodes.SIGN_IN_REQUIRED){
}
else if(code == GoogleSignInStatusCodes.NETWORK_ERROR){
}

Все константы можно найти в документации GoogleSignInStatusCode здесь...

https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes

и здесь...

https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes

Разрешение вопроса о регистрации

Вы даже можете попытаться решить проблему, указав, имеет ли ошибка разрешение...

private void handleSignInResult(GoogleSignInResult result) {
    if(!result.isSuccess()){

        Status status = result.getStatus();

        if(status.hasResolution()){
            status.startResolutionForActivity(this, SIGN_IN_RESOLUTION_REQUEST_CODE);
        }
    }
}

который запустит намерение, которое может, вероятно, решить проблему для пользователя. Затем вы можете проверить результат этого разрешения по методу onActivityResult...

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == SIGN_IN_RESOLUTION_REQUEST_CODE){
    }
}

Доступность API Google

Если все вышеперечисленное не выполнено. Следующее, что вы можете сделать, это проверить наличие Google API на пользовательском устройстве. В принципе, в одном комментарии вы признали, что ваше решение INDEED работает на некоторых устройствах. Если это так, то я склонен указать, что некоторым библиотекам Google требуется определенная версия служб Google Play

Лучший способ узнать, в чем конкретно проблема... это, выполнив проверку доступности API Google, а затем вывести столько информации, сколько вы можете logcat... вы можете сделать это легко, см. ниже...

private boolean checkPlayServices(){
    GoogleApiAvailability gaa = GoogleApiAvailability.getInstance();
    int result = gaa.isGooglePlayServicesAvailable(getApplicationContext());
    Log.d("isGooglePlayServicesAvailable returned %d", result);

    if(result != ConnectionResult.SUCCESS){
        if(gaa.isUserResolvableError(result)){
            gaa.getErrorDialog(this,result, REQUEST_PLAY_SERVICES_RESOLUTION).show();
        }

        return false;
    }

    return true;
}

isGooglePlayServicesAvailable вернет целочисленную константу, которая может быть переведена в одну из констант ConnectionResult. Список констант и его значение здесь довольно велики.

Еще одна ключевая часть вышеприведенного фрагмента кода заключается в том, что вы можете попытаться решить эту проблему системой, если ошибка легко разрешима, например, если пользователю необходимо обновить сервисы Google Play на своем устройстве, поскольку текущий версия устарела

Где бы вы использовали вышеуказанный метод?

Anywhere совершает первую попытку подключения к API Google. Например, используя исходный фрагмент кода...

private void handleSignInResult(GoogleSignInResult result) {

    if (result.isSuccess()) {
        //code block omitted
    } else {
        checkPlayServices();
    }
}

Ответ 6

Сегодня столкнулась с такой же проблемой, что она правильно работает над моим эмулятором и некоторыми старыми устройствами, но не на всех устройствах. Я зарегистрировал приложение на консоли разработчика и предоставил SHA1. Я решил это, изменив варианты сборки в представлении проекта. поэтому я отправляю свой ответ, я думаю, что это может быть полезно для кого-то.

  • Нажмите "Построить варианты" на левой стороне студии Android.

введите описание изображения здесь

  • Изменить варианты сборки из отладки для выпуска.

введите описание изображения здесь