Как правильно использовать Google Drive Rest API? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть приложение, в которое я хочу загрузить файл базы данных SQLite в учетную запись google drive пользователя.

Поскольку API Google Android перестанет работать, я подумал, что для реализации REST API, реализация REST API требует аутентификации.Я использую Google Sign-in, но REST API требует токен доступа определенного типа. Как это получить?

Я создал учетную запись в консоли разработчика, включил Drive API и добавил Scope for drive / auth.

Я достиг логинафункциональность с использованием официальной документации, https://developers.google.com/identity/sign-in/android/sign-in

Используя этот код, я могу получить электронную почту пользователя, а также создать DriveService,

    GoogleSignInOptions googleSignInOptions = new 
    GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestScopes(new Scope(DriveScopes.DRIVE))
                .requestEmail()
                .build();

    googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions);

    Intent googleSignInIntent = googleSignInClient.getSignInIntent();
    startActivityForResult(googleSignInIntent, REQUEST_CODE_SIGN_IN);

В отношении результата деятельности, я могу получитьучетная запись пользователя, используя учетную запись, я создаю DriveServiceHelper

    mDriveServiceHelper = new DriveServiceHelper(getGoogleDriveService(getApplicationContext(), googleSignInAccount, "appName"));

Теперь, когда я пытаюсь создать папку, он показывает мне ошибку о (UserRecoverableAuthIOException),

См. Код, с помощью которого я создаю папку.

public Task<GoogleDriveFileHolder> createFolder(final String folderName, @Nullable final String folderId) {
        return Tasks.call(mExecutor, new Callable<GoogleDriveFileHolder>() {
            @Override
            public GoogleDriveFileHolder call() {
                GoogleDriveFileHolder googleDriveFileHolder = new GoogleDriveFileHolder();

                List<String> root;
                if (folderId == null) {
                    root = Collections.singletonList("root");
                } else {

                    root = Collections.singletonList(folderId);
                }
                File metadata = new File()
                        .setParents(root)
                        .setMimeType(DriveFolder.MIME_TYPE)
                        .setName(folderName);

                File googleFile = null;
                googleFile = mDriveService.files().create(metadata).execute();
                googleDriveFileHolder.setId(googleFile.getId());
                return googleDriveFileHolder;
            }
        });
    }

Я пытался устранить ошибку, используя различные ветки обсуждения, доступные в StackOverflow, но ни один из них не работал, может кто-нибудь подсказать мне это?

1 Ответ

0 голосов
/ 30 мая 2019

Учитывая android.accounts.Account, вы можете использовать AccountManager.blockingGetAuthToken, установить этот токен в GoogleCredential, а затем передать его как HttpRequestInitializer в Drive.Builder* 1009.*.

String token = AccountManager.get(context)
    .blockingGetAuthToken(<android.accounts.Account>, "oauth2:" + DriveScopes.DRIVE, false);
GoogleCredential credential = new GoogleCredential().setAccessToken(token);
Drive service = new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
    .setApplicationName("app name")
    .build();

В конечном итоге срок действия этого токена истекает, и в этот момент вам нужно будет позвонить AccountManager.invalidateAuthToken и приобрести новый

Если вы включилиplay-services-auth библиотеки, тогда вы можете вместо этого передать эти учетные данные:

GoogleAccountCredential credential = GoogleAccountCredential
    .usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE))
    .setSelectedAccount(googleAccount.getAccount());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...