Получить все авторизованный GoogleSignInAccount's - Drive REST API - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь на самом деле авторизовать несколько учетных записей Google, а затем создать несколько Диск объектов, чтобы иметь возможность выполнять операции с файловой системой от имени обоих авторизованных пользователей одновременно.Проблема заключается в том, что GoogleSignInClient позволяет войти в систему только с одним пользователем одновременно, а GoogleSignIn запрашивает только последнюю зарегистрированную учетную запись ( getLastSignedInAccount ) и существуетнет возможности получить все авторизованные учетные записи, значит, я могу управлять только одним подключением Drive одновременно.Есть ли способ дать пользователю возможность подключить все свои учетные записи одновременно?

Я пытаюсь достичь того же, что и собственное приложение для выбора файлов Android, в котором одновременно доступны все доступные учетные записи дисков: enter image description here

Теперь у меня есть рабочий образец только для одной учетной записи:

private fun requestSignIn() {

        val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .requestScopes(Scope(DriveScopes.DRIVE))
                .build()

        client = GoogleSignIn.getClient(this, signInOptions)

        // The result of the sign-in Intent is handled in onActivityResult.
        startActivityForResult(client?.signInIntent, REQUEST_CODE_SIGN_IN)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        when (requestCode) {
            REQUEST_CODE_SIGN_IN -> {
                if (resultCode == Activity.RESULT_OK && data != null) {
                    handleSignInResult(data)
                }
            }
            else -> super.onActivityResult(requestCode, resultCode, data)
        }
    }

    private fun handleSignInResult(data: Intent) {
        GoogleSignIn.getSignedInAccountFromIntent(data)
                .addOnSuccessListener {
                    val credential =
                            GoogleAccountCredential.usingOAuth2(this, Collections.singleton(DriveScopes.DRIVE))
                    credential.selectedAccount = it.account

                    val googleDriveService = Drive.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            GsonFactory(),
                            credential)
                            .setApplicationName("CCFS")
                            .build()

                    // use drive service for a specific account
                }
                .addOnFailureListener {
                    Log.e("QWER", "Unable to sign in.", it)
                }
    }

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

1 Ответ

0 голосов
/ 30 декабря 2018

вам нужно будет использовать класс GoogleCredential для поддержки нескольких oAuth2 потоков:

Поточно-ориентированная реализация Google вспомогательного средства OAuth 2.0 для доступа к даннымзащищенные ресурсы, использующие токен доступа, а также, при необходимости, обновление токена доступа по истечении срока действия с использованием токена обновления.Поддерживаются три режима: только токен доступа, поток токенов обновления и поток учетной записи службы (с олицетворением пользователя или без него).

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

AccountManager можно использовать для хранения токенов альтернативных учетных записей Google.

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

(только предположение, из-за закрытого источника - но основано на поведении).

...