Как реализовать вход в Google

#android #google-signin

#Android #google-вход

Вопрос:

Я внедрил API входа в Google в своем приложении для Android. До недавнего времени все было хорошо. Одна из проблем, с которой я столкнулся, была связана с client_id, который был восстановлен. Самое последнее, что вызвало больше ошибок, заключается в том, что вход в Google не будет работать в созданном release.apk.

После двух дней отладки я решил создать новый демонстрационный проект, чтобы начать процесс заново. Это не будет работать как возврат false задачи task.isSuccessful .

Возможно, мне чего-то не хватает.

 const val RC_SIGN_IN = 0
class MainActivity : AppCompatActivity() {
    lateinit var observer:StartActivityForResults
    private lateinit var mGoogleSignInClient:GoogleSignInClient
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        observer = StartActivityForResults(activityResultRegistry)
        lifecycle.addObserver(observer)

        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build()

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        sign_in_button.setOnClickListener{
            signIn()
        }
    }

    private fun signIn() {


        val signInIntent = mGoogleSignInClient.signInIntent

        startActivityForResult(signInIntent, RC_SIGN_IN)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            val task = Auth.GoogleSignInApi.getSignInResultFromIntent(data)

            task?.isSuccess

            Toast.makeText(this, "Success", Toast.LENGTH_LONG).show()
        }
        else{
            Log.i("title", "OKCODE ${Activity.RESULT_OK} RESULTCODE ${resultCode}")
        }
    }
}
  

Ответ №1:

Легко добавьте вход в свое приложение для Android с помощью FirebaseUI

Если вы еще этого не сделали, добавьте Firebase в свой проект Android.

Добавьте зависимости для FirebaseUI в файл build.gradle на уровне приложения

     dependencies {
    // ...

    implementation 'com.firebaseui:firebase-ui-auth:6.2.0'
}
  

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

Если вы поддерживаете вход в Google и еще не указали отпечаток пальца SHA-1 вашего приложения, сделайте это на странице настроек консоли Firebase

 // Choose authentication providers
val providers = arrayListOf(
        AuthUI.IdpConfig.EmailBuilder().build(),
        AuthUI.IdpConfig.PhoneBuilder().build(),
        AuthUI.IdpConfig.GoogleBuilder().build(),
        AuthUI.IdpConfig.FacebookBuilder().build(),
        AuthUI.IdpConfig.TwitterBuilder().build())

// Create and launch sign-in intent
startActivityForResult(
        AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setAvailableProviders(providers)
                .build(),
        RC_SIGN_IN)
  

Когда процесс входа в систему будет завершен, вы получите результат в onActivityResult:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == RC_SIGN_IN) {
        val response = IdpResponse.fromResultIntent(data)

        if (resultCode == Activity.RESULT_OK) {
            // Successfully signed in
            val user = FirebaseAuth.getInstance().currentUser
            // ...
        } else {
            // Sign in failed. If response is null the user canceled the
            // sign-in flow using the back button. Otherwise check
            // response.getError().getErrorCode() and handle the error.
            // ...
        }
    }
}
  

Ответ №2:

Не уверен, отвечает ли это на ваш вопрос, но я столкнулся с аналогичной проблемой, когда подписание работало в отладочных сборках и не работало в сборках выпуска.

В консоли Firebase, если у вас включен вход в Google, вам будет предложено ввести ключ SHA-1 вашей сборки. Теперь, что произошло в моем случае, я получил ключ SHA-1 для хранилища ключей отладки и не сделал этого для хранилища ключей выпуска.

Попробуйте,

keytool -list -v
-alias -хранилище ключей

и введите его в консоли Firebase.