Вход в Google не работает на устройстве, но в эмуляторе работает нормально?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Вход в Google не работает на устройстве, но в эмуляторе работает нормально?

Сообщение Anonymous »

Я работаю над приложением исключительно для внутреннего использования, а не для Play Store или чего-то в этом роде. Его необходимо установить на наш сканер Zebra под управлением Android 10.
Цель приложения — просматривать Google Диск, а затем мы выбираем электронные таблицы и сканируем материалы.В настоящее время при использовании эмулятора (Android 10) все работает как положено, вход в Google работает (все с использованием устаревших методов, так как я не могу понять, как использовать новые методы) и все остальное мое приложение работает должным образом.
Проблема возникает, когда я пытаюсь установить приложение на физическое устройство. Я получаю нижний лист «Вход в систему» ​​(ожидается), а затем экран «Google не подтвердил это приложение» (неожиданно). Я не получаю этого при запуске эмулятора, поскольку он входит в систему, как ожидалось.
Когда я нажимаю «Продолжить», я получаю экран «Что-то пошло не так». Когда я нажимаю «Далее» на этом экране, я получаю экран Google с надписью «400». Это ошибка».
Как ни странно, в журналах появляется сообщение «Учетные данные успешно получены».
Я использую одну и ту же учетную запись Google на обоих эмулятор и физическое устройство.
Это фрагмент моего onCreate

Код: Выделить всё

authorizationLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val authorizationResult = Identity.getAuthorizationClient(this)
.getAuthorizationResultFromIntent(result.data)
initializeDriveService(authorizationResult, initialFolderId = "1R0p0N30zZLltpRBJqIN3PGR5dMnLnx1M")
authorizationStatus.value = "Authorization successful"
} else {
authorizationStatus.value = "Authorization failed"
}
}

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(getString(WEB_CLIENT_ID))
.requestScopes(Scope(DriveScopes.DRIVE), Scope(SheetsScopes.SPREADSHEETS))
.build()

googleSignInClient = GoogleSignIn.getClient(this, gso)

signInWithGoogle()

setContent {
ZebraStockScannerTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
if (::driveService.isInitialized && fileListState.value.isNotEmpty()) {
GoogleFileExplorer(
driveService = driveService,
initialFolderId = "",
fileListState = fileListState,
onExtractedDataChanged = { newData ->
extractedData = newData
}
)
} else {
Text(text = "Connecting to Google Drive, please wait...")
}
}
}
}
Остальные функции входа в систему, извините за беспорядок. Довольно новое для Android-кодирования.

Код: Выделить всё

private fun signInWithGoogle() {
val credentialManager = CredentialManager.create(this)
val nonce = generateNonce()

val googleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(getString(WEB_CLIENT_ID))
.setAutoSelectEnabled(true)
.setNonce(nonce)
.build()

val request = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()

lifecycleScope.launch {
try {
val result = credentialManager.getCredential(
request = request,
context = this@GoogleSignInActivity
)
Log.d(TAG, "Credentials retrieved successfully")
handleSignIn(result)
} catch (e: NoCredentialException) {
signInWithGoogleFallback()
} catch (e: GetCredentialException) {
handleSignInFailure(e, this@GoogleSignInActivity)
} catch (e: Exception) {
}
}
}

private fun signInWithGoogleFallback() {
val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}

private fun handleSignIn(result: GetCredentialResponse) {
when (val credential = result.credential) {
is GoogleIdTokenCredential -> {
try {
val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
Log.d(TAG, "Google ID Token: ${googleIdTokenCredential.id}")
userEmail = googleIdTokenCredential.id
requestDriveAuthorization(initialFolderId = "")
} catch (e: GoogleIdTokenParsingException) {
authorizationStatus.value = "Invalid Google ID token response"
} catch (e: Exception) {
Log.e(TAG, "Unexpected error during Google ID token parsing: ${e.message}", e)
}
}

else -> {
Log.e(TAG, "Unexpected type of credential")
authorizationStatus.value = "Unexpected type of credential"
}
}
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_AUTHORIZE &&  resultCode == Activity.RESULT_OK) {
val authorizationResult =
Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data)
initializeDriveService(authorizationResult, initialFolderId = "1R0p0N30zZLltpRBJqIN3PGR5dMnLnx1M")
} else if (requestCode == RC_SIGN_IN) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
try {
handleSignInResult(task)
} catch (e: Exception) {
Log.e(TAG, "Error handling sign-in result: ${e.localizedMessage}")
authorizationStatus.value = "Sign-in error: ${e.localizedMessage}"
}
}
}

private fun handleSignInResult(completedTask: Task) {
try {
val account = completedTask.getResult(ApiException::class.java)
userEmail = account.email
requestDriveAuthorization(initialFolderId = "1w9iWcvUtfwK-i5EC-azALMlMfuyDnHmb")
} catch (e: ApiException) {
authorizationStatus.value = "Google sign-in failed: ${e.statusCode}"
} catch (e: Exception) {
Log.e(TAG, "Unexpected error during sign-in: ${e.localizedMessage}")
}
}

private fun requestDriveAuthorization(initialFolderId: String) {
val requestedScopes = listOf(Scope(DriveScopes.DRIVE), Scope(SheetsScopes.SPREADSHEETS))
val authorizationRequest = AuthorizationRequest.Builder()
.setRequestedScopes(requestedScopes)
.build()

Identity.getAuthorizationClient(this)
.authorize(authorizationRequest)
.addOnSuccessListener { authorizationResult ->
if (authorizationResult.hasResolution()) {
val pendingIntent = authorizationResult.pendingIntent
try {
val intentSenderRequest = pendingIntent?.let { IntentSenderRequest.Builder(it).build() }
authorizationLauncher.launch(intentSenderRequest)
} catch (e: Exception) {
}
} else {
initializeDriveService(authorizationResult, initialFolderId)
authorizationStatus.value = "Authorization successful"
}
}
.addOnFailureListener { e ->
Log.e(TAG, "Failed to authorize", e)
if (e is UserRecoverableAuthIOException) {
startActivityForResult(e.intent, REQUEST_AUTHORIZE)
} else {
authorizationStatus.value = "Authorization failed"
}
}
}

private fun initializeDriveService(authorizationResult: AuthorizationResult, initialFolderId: String) {
lifecycleScope.launch {
try {
val credential = GoogleAccountCredential.usingOAuth2(
this@GoogleSignInActivity, listOf(DriveScopes.DRIVE, SheetsScopes.SPREADSHEETS)
)
credential.selectedAccountName = userEmail

driveService = Drive.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(),
credential
).setApplicationName(getString(R.string.app_name)).build()

// Initialize folder name and ID caches
val folderNameCache = mutableMapOf()
val folderIdCache = mutableMapOf()

// Fetch the initial file list from the specified folder ID
val files = fetchFiles(driveService, initialFolderId, folderNameCache, folderIdCache)
// Update UI or state with fetched files
fileListState.value = files
} catch (e:  Exception) {
Log.e("GoogleSignInActivity", "Error initializing Drive service", e)
showDialogState.value = true
errorMessageState.value = "Failed to initialize Drive service."
}
}
}
Я пробовал обновить ключи SHA-1 на консоли Firebase любыми другими, которые, по моему мнению, могли бы быть.
Я пробовал использовать другая учетная запись, которая работает на эмуляторе, и результат тот же.
Честно говоря, я не могу придумать ничего другого, что можно было бы попробовать, поскольку на самом деле я не получаю какого-либо конкретного кода ошибки.
Любая помощь или совет будут очень признательны, поскольку я понимаю, что это может быть узкоспециализированный вопрос.

Подробнее здесь: https://stackoverflow.com/questions/786 ... n-emulator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»