Цель приложения — просматривать 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...")
}
}
}
}
Код: Выделить всё
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."
}
}
}
Я пробовал использовать другая учетная запись, которая работает на эмуляторе, и результат тот же.
Честно говоря, я не могу придумать ничего другого, что можно было бы попробовать, поскольку на самом деле я не получаю какого-либо конкретного кода ошибки.
Любая помощь или совет будут очень признательны, поскольку я понимаю, что это может быть узкоспециализированный вопрос.
Подробнее здесь: https://stackoverflow.com/questions/786 ... n-emulator
Мобильная версия