# #android #google-cloud-platform #google-drive-api
Вопрос:
У меня есть приложение, которое хранит app-database.db
файл на Google Диске пользователя appDataFolder
. Приложение еще не опубликовано, поэтому в настоящее время я единственный пользователь, использующий приложение.
API key
и OAuth Client ID
для обоих debug
типов и release
типов сборки генерируются Google Cloud Console
. Проект добавляется Firebase Console
, а google-services.json
файл добавляется в основную папку модуля приложения.
OAuth Contest
завершено, его набор In Production
и добавленные области являются .../auth/drive.appdata
и .../auth/drive.file
которые оба являются non-sensitive scopes
, так Verification not required
что . Также Google Drive API
включен в Google Cloud Console
.
Отправка пользователя на экран входа, как это:
val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(Scope(DriveScopes.DRIVE_FILE))
.requestScopes(Scope(DriveScopes.DRIVE_APPDATA))
.requestEmail()
.build()
startActivityForResult(GoogleSignIn.getClient(this, signInOptions).signInIntent, SIGN_IN_REQ_CODE)
Проверка результата подписи выглядит следующим образом:
GoogleSignIn.getSignedInAccountFromIntent(result)
.addOnSuccessListener { account: GoogleSignInAccount ->
if (GoogleSignIn.hasPermissions(account, *scopes)) {
val drive = GoogleAccountCredential.usingOAuth2(this@SomeActivity, credentialScopes)
.apply { selectedAccount = account.account }
.let {
Drive.Builder(AndroidHttp.newCompatibleTransport(), GsonFactory(), it)
.setApplicationName("APP_NAME_FROM_CONTEST_SCREEN")
.build()
}
// ...
} else {
GoogleSignIn.requestPermissions(this@SomeActivity, PERMISSIONS_REQ_CODE, account, *scopes)
}
}.addOnFailureListener {
// ...
}
private val scopes = arrayOf(Scope(DriveScopes.DRIVE_FILE), Scope(DriveScopes.DRIVE_APPDATA), Scope(Scopes.PROFILE), Scope(Scopes.OPEN_ID), Scope(Scopes.EMAIL))
private val credentialScopes = listOf(DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_APPDATA)
Теперь, когда я пытаюсь загрузить или загрузить файл из/в любую папку Drive API Client v3
, он отлично работает debug build
. Но в release build
я получаю:
403 Forbidden
{
"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."
}
Так в чем же проблема? Он работает как внутри debug
, так и не внутри release
, хотя ключи для обоих типов добавляются внутри консоли. Любая помощь будет признательна.
Обновить
Я решил minifyEnabled
true
, так что для меня проблема заключалась в правилах proguard. Добавление правил proguard устранило проблему.
# Needed to keep generic types and @Key annotations accessed via reflection
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-keepclassmembers class * { @com.google.api.client.util.Key <fields>; }
# Needed by google-http-client-android when linking against an older platform version
-dontwarn com.google.api.client.extensions.android.**
# Needed by google-api-client-android when linking against an older platform version
-dontwarn com.google.api.client.googleapis.extensions.android.**
# Needed by google-play-services when linking against an older platform version
-dontwarn com.google.android.gms.**
Комментарии:
1. Превышен ежедневный лимит для использования без проверки подлинности. означает, что вы не отправили заголовок авторизации и токен на предъявителя с вашим запросом в api. Похоже, вы пытаетесь смешать signin и Oauth2. Это две разные вещи. попробуйте использовать клиентскую библиотеку java Google api, возможно, что-то вроде этого medium.com/android-dev-hacks/…
2. @DalmTo использует ту же библиотеку и выполняет те же действия, описанные в ссылке выше, но в сборке выпуска возникает то же исключение. Вопрос в том, есть ли какие-либо проблемы с заголовками или доступом, как код отлично работает в отладочной сборке.