Как получить доступ к файлу папок приложения Google Drive с помощью Flutter? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть этот очень старый проект Android, который я давно не трогал.Он хранит некоторые пользовательские данные в папке appdata пользователей Google Диска.Сейчас я обновляю приложение до версии Flutter, и поскольку Google Drive API устарел, для Flutter нет плагина, я считаю, что сейчас мне нужно использовать googleapi.Но я не могу найти много о моей проблеме флаттера.Я дошел до точки входа в систему с помощью google_sign_in: ^ 4.0.7

GoogleSignIn _googleSignIn = GoogleSignIn(
    scopes: [
      'email',
      'https://www.googleapis.com/auth/drive.appdata',
      'https://www.googleapis.com/auth/drive.file',
    ],
  );
  try {
    GoogleSignInAccount account = await _googleSignIn.signIn();
  } catch (error) {
    print(error);
  }

Это прекрасно работает, но я застрял там.Как я могу перейти оттуда и прочитать файл в папке appdata на Google Drive пользователя?

EDIT1: Этот ответ помог, мне удалось получить httpClient, но я все еще застрял на том, как получить appdataпапка и ее файлы Как использовать Google API во флаттере?

Похоже, googleapi не поддерживает папку приложений, поскольку Google МОЖЕТ устареть в будущем (кажется, что они уже сделали это)), чтобы заставить нас платить за хранение с помощью Firebase.Хорошо, хорошо, но как мне перенести его, если я не могу получить доступ к папке через googleapi?Если я сейчас переустановлю свое приложение и мои пользователи потеряют все свои данные, я потеряю несколько моих пользователей ...

1 Ответ

1 голос
/ 26 сентября 2019

Следующее работает для меня, (используя пакет http для get и post)

Auth Token

Youможет получить токен аутентификации из accoutn, возвращенного signIn.

Future<String> _getAuthToken() async {
  final account = await sign_in_options.signIn();
  if (account == null) {
    return null;
  }
  final authentication = await account.authentication;
  return authentication.accessToken;
}

Поиск

Для поиска файлов в каталоге AppData необходимо добавить spaces queryParameters и установите его в appDataFolder.Документация в этом отношении вводит в заблуждение.

final Map<String, String> queryParameters = {
  'spaces': 'appDataFolder',
  // more query parameters
};
final headers = { 'Authorization': 'Bearer $authToken' };
final uri = Uri.https('www.googleapis.com', '/drive/v3/files', queryParameters);
final response = await get(uri, headers: headers);

Загрузка

Чтобы загрузить файл, вам необходимо установить для свойства parents значение appDataFolderтело для первоначального запроса на загрузку.Для загрузки файла вам нужен только идентификатор файла.

final headers = { 'Authorization': 'Bearer $authToken' };
final initialQueryParameters = { 'uploadType': 'resumable' };
final Map<String, dynamic> metaData = { 
  'name': fileName,
  'parents': ['appDataFolder ']
};
final initiateUri = Uri.https('www.googleapis.com', '/upload/drive/v3/files', initialQueryParameters);
final initiateResponse = await post(initiateUri, headers: headers, body: json.encode(metaData));
final location = initiateResponse.headers['location'];

Загрузка

Для загрузки файла вам нужно знать только fileId, если вы неЧтобы узнать, вам нужно использовать API поиска, чтобы получить его (см. выше).

final headers = { 'Authorization': 'Bearer $authToken' };
final url = 'https://www.googleapis.com/drive/v3/files/$fileId?alt=media';
final response = await get(url, headers: headers);
...