#java #android-studio #google-drive-api #google-oauth #google-api-java-client
#java #android-студия #google-drive-api #google-oauth #google-api-java-client
Вопрос:
Как я могу создать файл на Google Диске «AppDataFolder»?
Я создал настройки консоли разработчика Google, которые необходимы для создания файла и доступа к «AppDataFolder».
Android Studio выводит сообщения об ошибках, как показано ниже.
W/System.err: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code": 403,
"errors": [
{
"domain": "global",
"message": "The granted scopes do not allow use of the Application Data folder.",
"reason": "insufficientScopes"
}
],
"message": "The granted scopes do not allow use of the Application Data folder."
}
W/System.err: at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:432)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.example.test1.MainActivity$3.run(MainActivity.java:131)
at java.lang.Thread.run(Thread.java:923)
Исходный код
File body = new File();
body.setName(FILE_TITLE);//fileContent.getName());
body.setMimeType("text/plain");
body.setParents(Collections.singletonList("appDataFolder"));
File file = service.files().create(body, content)
.setFields("id")
.execute();
Если следующая строка закомментирована в исходном коде, мое приложение может создать файл в
верхней папке Google Диска, а не «AppDataFolder».
body.setParents(Collections.singletonList("appDataFolder"));
Android Studio 4.1.2
введите описание изображения здесь
С наилучшими пожеланиями. Заранее спасибо.
Ответ №1:
Хотя, судя по вашему изображению консоли разработчика, вы, похоже, включили большое количество областей. Проблема здесь не в ваших настройках в консоли разработчика Google, а скорее в областях, в которых вы авторизовали своего пользователя.
Когда вы запускаете свое приложение, пользователю предлагается дать согласие на доступ к некоторым своим данным, это область авторизации для вашего приложения. Он определяет, для чего пользователь предоставил вашему приложению доступ.
Если ваш код запрашивает доступ только для чтения, и вы пытаетесь записать в него, тогда вы увидите сообщение об ошибке incomplicientscopes.
Вам нужно проверить, какая область требуется для используемого вами метода, а затем убедиться, что при авторизации вашего пользователя вы запрашиваете эту область.
Я предполагаю, что у вас есть что-то вроде этого
private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY);
Вам нужно включить эту область https://www.googleapis.com/auth/drive.appdata
, которая, вероятно, представляет собой что-то вроде DriveScopes.DRIVE_APPDATA
Помните, что после изменения областей действия в вашем приложении вам потребуется повторно авторизовать пользователя. Если вы храните согласие, то его необходимо удалить, чтобы снова запросить авторизацию.
Комментарии:
1. Спасибо вам за ваш быстрый комментарий. Могу я спросить, почему, по вашему мнению, мой код запрашивает доступ только для чтения? Я предполагаю, что мое приложение попытается записать (создать файл).
2. В моем макете экрана приложения для Android есть один EditText и две кнопки. После нажатия кнопки «Сохранить» на моем терминале Android появится экран согласия OAuth, как вы говорите. Экран согласия запрашивает у меня отображение, редактирование, создание, удаление всех файлов на Google Диске. И после того, как я соглашусь с этим, мое приложение запрашивает создание файла в определенной папке с именем «AppDataFolder», который не виден владельцу данных Google Диска.
3. Но произошла ошибка, несмотря на включение области «… / auth / drive.appdata» в настройки экрана согласия консоли разработчика Google.
4. Я предполагаю, что вы запрашиваете доступ только для чтения, потому что вы не указали свой код авторизации, чтобы мы могли видеть, какие области вы запросили. После того, как вы изменили область действия, помните, что вам нужно принудительно выполнить повторную авторизацию пользователя, чтобы он принял изменения, иначе ваш код просто будет работать со старым согласием.
5. учетные данные = GoogleAccountCredential.usingOAuth2(это, Arrays.asList(DriveScopes. ПРИВОД, приводные телескопы. DRIVE_APPDATA));