Переход с Google Drive API на REST API - PullRequest
       41

Переход с Google Drive API на REST API

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

Поскольку Google не поддерживает API Android, я пытаюсь перейти на REST API.

Мое приложение использует Google Drive для сохранения данных пользователя.

У пользователя есть два варианта резервного копирования (вручную и по расписанию).

Пользователь выбирает учетную запись, и она сохраняется в приложении (электронная почта).

При необходимости приложение использует учетную запись для подключения к Google Диску и сохранения /удалить данные.

Чтобы выбрать учетную запись для использования приложения, используйте AccountPicker.

После выбора учетной записи приложение использует только учетную запись для подключения к Google Диску (см. кодниже).

Я хотел бы сохранить текущий механизм (пользователь выбирает учетную запись, и при необходимости приложение использует эту учетную запись для подключения к Google Drive).

Я посмотрел на образец программы и миграция документации, но не выяснили, как это сделать.

Кажется, что в примере приложения запрашивается учетная запись с выделенным действием ииспользует ретвынудили данные войти в Google Drive (не то поведение, которое мне нужно).

Я сделал некоторые изменения кода, но ничего не получилось (я получил ошибку Ошибка подключения к диску (12500) 12500: 12500: Ошибка при настройке учетной записи Google. ).См. Ниже измененный код.

Выход из кода

GoogleApiClient.Builder builder = new GoogleApiClient.Builder(context)
                .addApi(Drive.API)
                .setAccountName(accountName)
                .addScope(Drive.SCOPE_FILE)
                .addScope(Drive.SCOPE_APPFOLDER);
client = builder.build();
client.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
            @Override
            public void onConnectionSuspended(int cause) {
            }

            @Override
            public void onConnected(Bundle arg0) {
                latch.countDown();
            }
        });
client.registerConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
            @Override
            public void onConnectionFailed(ConnectionResult result) {
                error = new DriveConnectException();
                if (result.hasResolution()) {
                    if (activity != null) {
                        try {
                            result.startResolutionForResult(activity, requestCode);
                            error = new InResolutionException();
                        } catch (IntentSender.SendIntentException e) {
                        }
                    }
                }
                latch.countDown();
            }
        });
client.connect();
try {
    latch.await();
} catch (Exception ignored) {
}
if (client.isConnected()) {
    // do some work
} else {
    // report error
}

Измененный код

GoogleSignInOptions signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .setAccountName(accountName)
                .requestScopes(new Scope(DriveScopes.DRIVE))
                .build();
client = GoogleSignIn.getClient(context, signInOptions);
Task<GoogleSignInAccount> task = client.silentSignIn();
if (task.isSuccessful()) {
    signInAccount = task.getResult();
} else {
    final CountDownLatch latch = new CountDownLatch(1);
    task.addOnCompleteListener(new OnCompleteListener<GoogleSignInAccount>() {
        @Override
        public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
            try {
                signInAccount = task.getResult(ApiException.class);
            } catch (ApiException e) {
                // I always ends up here.
            }
            latch.countDown();
        }
    });
    try {
        latch.await();
    } catch (Exception ignored) {
    }
}

1 Ответ

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

Сначала вам необходимо войти в систему:

    GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
            .build();
    GoogleSignInClient client = GoogleSignIn.getClient(activity, signInOptions);

    // The result of the sign-in Intent is handled in onActivityResult
    startActivityForResult(client.getSignInIntent(), RC_CODE_SIGN_IN);

В onActivityResult:

GoogleSignIn.getSignedInAccountFromIntent(result)
                .addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
                    @Override
                    public void onSuccess(GoogleSignInAccount googleSignInAccount) {
                        HyperLog.i(TAG, "Signed in as " + googleSignInAccount.getEmail());
                        mDriveServiceHelper = getDriveServiceHelper(googleSignInAccount);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        HyperLog.e(TAG, "Unable to sign in!", e);
                    }
                });

Если пользователь вошел в систему, вы можете получить последнюю учетную запись входа в Google с помощью:

GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getActivity());

И чтобы получить DriveServiceHelper, вы можете использовать полученную учетную запись:

mDriveServiceHelper = getDriveServiceHelper(account);

Метод "getDriveServiceHelper" выглядит следующим образом:

private DriveServiceHelper getDriveServiceHelper(GoogleSignInAccount googleSignInAccount) {
        // Use the authenticated account ot sign in to the Drive service
        GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
                activity, Collections.singleton(DriveScopes.DRIVE_FILE));
        credential.setSelectedAccount(googleSignInAccount.getAccount());

        Drive googleDriveService = new Drive.Builder(AndroidHttp.newCompatibleTransport(),
                new GsonFactory(), credential)
                .setApplicationName("COL Reminder")
                .build();
        return new DriveServiceHelper(googleDriveService);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...