Ошибка при переходе на последнюю версию Google Drive API в Android - превышен суточный лимит для использования без аутентификации. Продолжение использования требует регистрации - PullRequest
2 голосов
/ 12 октября 2019

Приложение опубликовано в Play Store и использует «папку данных приложения» для целей резервного копирования и восстановления с использованием Drive API . Все отлично работаетТем не менее, согласно объявлению Google, этот API будет закрыт 6 декабря 2019 года. Поэтому для поддержки существующих пользователей я перешел на последний API согласно рекомендациям по миграции и официальному образцу приложения .

Я могу успешно пройти аутентификацию, используя код ( по официальной ссылке ) ниже.

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

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

Я также использую правильную область действия - DriveScopes.DRIVE_APPDATA, как указано вофициальная документация.

Я также вижу правильные значения «email» и «предоставленные области действия» внутри onActivityResult()

if (requestCode == REQUEST_CODE_SIGN_IN && resultCode == RESULT_OK) {

   GoogleSignIn.getSignedInAccountFromIntent(data).addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
                @Override
                public void onSuccess(GoogleSignInAccount googleSignInAccount) {

                    Log.e("TAG", "Email - " + googleSignInAccount.getEmail()); // prints correct value
                    Log.e("TAG", "Granted scopes - " + googleSignInAccount.getGrantedScopes()); // prints correct value

                    GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(getActivity(), Collections.singleton(DriveScopes.DRIVE_APPDATA));
                    credential.setSelectedAccount(googleSignInAccount.getAccount());

                    Drive googleDriveService = new Drive.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new GsonFactory(),
                            credential)
                            .setApplicationName("App Name") // Changed it for now
                            .build();
                    mDriveServiceHelper = new DriveServiceHelper(googleDriveService);

                    queryFiles();
                }
            });
}

Однако всякий раз, когда я пытаюсь получить доступ к файлу резервной копии в queryFiles() используя код ( из официальной ссылки ) ниже,

FileList files = driveService.files().list()
    .setSpaces("appDataFolder")
    .setFields("nextPageToken, files(id, name)")
    .setPageSize(10)
    .execute();
for (File file : files.getFiles()) {
  System.out.printf("Found file: %s (%s)\n",
      file.getName(), file.getId());
}

Выдает следующую ошибку

{
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }

Пожалуйста, помогите мне исправить ошибку. Я считаю, что, поскольку с опубликованной версией все работает нормально, все должно быть правильно с точки зрения настройки на консоли API Google.

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Я, вероятно, не могу найти ВСЕ темы с этой проблемой, но я могу попытаться помочь в нескольких или около того.

ПЕРВИЧНЫЙ ОТВЕТ

ЕСЛИ выиспользую ProGuard так же, как и я. ProGuard может вызвать эту ошибку во время запроса. Я исправил это с помощью следующего:

# Fix OAuth Drive API failure for release builds
-keep class * extends com.google.api.client.json.GenericJson { *; }
-keep class com.google.api.services.drive.** { *; }
-keepclassmembers class * { @com.google.api.client.util.Key <fields>; }

ВТОРОЙ ОТВЕТ

Обратите внимание, что вам НЕ необходимо использовать ключи / токены при использовании Driveостальные API с Android, как вы можете найти из других решений (это может не повредить, но может). Здесь это не соответствует тому, о чем люди говорят в другом месте (здесь они не знают, о чем говорят).

См. Мои заметки здесь для получения дополнительной информации: Google Диск через OAuth-релизверсия получает dailyLimitExceededUnreg

Если у вас возникла проблема с отладочной сборкой , то вы сделали все неправильно. Мои записи должны помочь вам в правильном направлении.

Если вам понадобится дополнительная помощь, я мог бы помочь из-за того, как это чокнуто.

ПРИМЕР ПОЛУЧЕНИЯ ФАЙЛА ИЗ ПРИВОДА СNEW API USE

Просто посмотрите по следующей ссылке

public Task<Pair<String, String>> readFile(String fileId)

https://github.com/gsuitedevs/android-samples/blob/master/drive/deprecation/app/src/main/java/com/google/android/gms/drive/sample/driveapimigration/DriveServiceHelper.java

Идентификатор исходит из результата запроса, где идентификатор является частью этогоинформация запроса, прикрепленная к тому, что возвращается из запроса Drive. Идентификатор - это идентификатор файла, который вы хотите получить. Передайте это в readFile, и оно вернет вам содержимое файла, которое вы можете сохранить локально в java.io.File, например fileOutputStream.write (contents.getBytes ());содержимое которого состоит из пары. Тогда у вас будет, надеюсь, (потому что иногда у нас больше работы) идентичный java.io.File.

Вы можете увидеть базовый запрос, если он вам нужен и в примере ссылки, но в нем отсутствуют некоторыеважная информация, потому что, в зависимости от того, что вы делаете, вам может понадобиться проверить, не были ли они повреждены, получить размер файла, изменить время, md5, установить порядок и т. д. Вам может понадобиться просмотреть https://developers.google.com/drive/api/v2/reference/files/list и https://developers.google.com/drive/api/v3/reference/files и т. д., чтобыпонять это. Если файлов будет достаточно, то будет требоваться постраничная пересылка.

Я знаю, что использовать Drive from code немного чокнуто (ну, во всяком случае, мне в любом случае, lol), так что держитесь там =)

0 голосов
/ 14 октября 2019

Для целей документирования в качестве шага устранения неполадок:

Перейдите на

https://console.developers.google.com/project/<project-id>/apiui/api

Или для сценариев Google:

https://script.google.com/home/usersettings

Замените на идентификатор вашего приложения иубедитесь, что Google Drive API включен.

Если это не так - обязательно получите новый токен после его включения, если это так.

...