繁体   English   中英

如何在flutter中使用谷歌API?

[英]How to use Google API in flutter?

我想在我的 Flutter 应用程序中使用 Google Cloud Natural Language,我得到了Google API package这适用于 flutter 并且Google API_AUTH依赖适用于 0.2.1。 我如何实施它们?

这对我有用:

使用包google_sign_in登录,然后从中获取身份验证标头:

import 'package:google_sign_in/google_sign_in.dart'
    show GoogleSignIn, GoogleSignInAccount;

import 'package:googleapis/people/v1.dart'
    show ListConnectionsResponse, PeopleApi;

useGoogleApi() async {
  final _googleSignIn = new GoogleSignIn(
    scopes: [
      'email',
      'https://www.googleapis.com/auth/contacts.readonly',
    ],
  );

  await _googleSignIn.signIn();

  final authHeaders = _googleSignIn.currentUser.authHeaders;

  // custom IOClient from below
  final httpClient = GoogleHttpClient(authHeaders); 

  data = await PeopleApi(httpClient).people.connections.list(
      'people/me',
      personFields: 'names,addresses',
      pageToken: nextPageToken,
      pageSize: 100,
  );
}

这是一个自定义IOClient实现,可自动将 auth 标头添加到每个请求。 googleapis 调用支持传递要使用的自定义 HTTP 客户端而不是默认值(见上文)

import 'package:http/io_client.dart';
import 'package:http/http.dart';

class GoogleHttpClient extends IOClient {
  Map<String, String> _headers;

  GoogleHttpClient(this._headers) : super();

  @override
  Future<StreamedResponse> send(BaseRequest request) =>
      super.send(request..headers.addAll(_headers));

  @override
  Future<Response> head(Object url, {Map<String, String> headers}) =>
      super.head(url, headers: headers..addAll(_headers));

}

我还不能添加评论,所以我只是把它作为答案发布。

我一直试图按照最佳答案制作 GoogleHttpClient,但在导入时,它说“库 'package:http/http.dart' 不会导出显示名称为 'IOClient' 的成员。”

我在这里找到了答案https://pub.dartlang.org/packages/http#-changelog-tab- ,它说你应该像这样单独导入 IOClient: import 'package:http/io_client.dart';

我认为这可能会帮助其他不熟悉 Flutter 及其 Google API 实现的人。

接受的答案很可能是针对旧版本的 SDK 编写的,我只是无法使其正常工作。 这就是目前对我有用的方法。

例如,以下允许我们访问 Google Drive 中的文件,它是googleapis 的一部分。

依赖关系

pubspec.yaml:

dependencies:
  google_sign_in: any
  googleapis: any

(我只是把any一个作为例子,但你应该为你的实际应用程序指定版本。)

这个怎么运作

必要的进口:

import 'package:googleapis/drive/v3.dart' as drive;
import 'package:google_sign_in/google_sign_in.dart' as signIn;

第 1 步,登录用户并请求访问 google drive 的权限(范围):

final googleSignIn = signIn.GoogleSignIn.standard(scopes: [drive.DriveApi.DriveScope]);
final sign.GoogleSignInAccount account = await googleSignIn.signIn();

第二步,构建一个AuthenticateClient

class AuthenticateClient extends http.BaseClient {
  final Map<String, String> headers;

  final http.Client client;

  AuthenticateClient(this.headers, this.client);

  Future<http.StreamedResponse> send(http.BaseRequest request) {
    return client.send(request..headers.addAll(headers));
  }
}

正如http 中所建议的,这是使用带有额外身份验证标头(可组合)的BaseClient

第 3 步,使用第 1 步和第 2 步创建一个经过身份验证的 http 客户端并访问 google drive API。

final baseClient = new Client();
final authenticateClient = AuthenticateClient(authHeader, baseClient);
final driveApi = drive.DriveApi(authenticateClient);

查看如何在 Flutter 应用程序中使用 Google Drive API了解详细信息。

更新已接受的答案

除了google_sign_ingoogleapis包,现在您可以使用extension_google_sign_in_as_googleapis_auth包(由 flutter.dev 提供)来配置 http 客户端。 因此,可接受的答案可以简化为以下内容。 不需要实现 GoogleHttpClient。

import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/people/v1.dart';

useGoogleApi() async {
  final _googleSignIn = new GoogleSignIn(
    scopes: [
      'email',
      PeopleServiceApi.contactsReadonlyScope,
    ],
  );

  await _googleSignIn.signIn();

  // custom IOClient
  final httpClient = await _googleSignIn.authenticatedClient();

  data = await PeopleApi(httpClient!).people.connections.list(
      'people/me',
      personFields: 'names,addresses',
      pageToken: nextPageToken,
      pageSize: 100,
  );
}

在您可以使用 googleapis 包中列出的所有 api 之后,您需要获得 2 个包googleapis_authgoogleapis 我会在一个例子下告诉你

import 'package:googleapis/androidpublisher/v3.dart' as androidPublisher;
import 'package:googleapis_auth/auth_io.dart' as auth;

final _credentials = new auth.ServiceAccountCredentials.fromJson(r'''
      {
        "private_key_id": ...,
        "private_key": ...,
        "client_email": ...,
        "client_id": ...,
        "type": "service_account"
      }
      ''');

    const _SCOPES = const [
      androidPublisher.AndroidpublisherApi.AndroidpublisherScope
    ];

    auth.clientViaServiceAccount(_credentials, _SCOPES).then((httpClient) {
      var publisher = new androidPublisher.AndroidpublisherApi(httpClient);
      publisher.purchases.products
          .get(
              packageName,
              productID,
              purchaseToken)
          .then((pub) {
        debugPrint(pub.toJson().toString());
      });
    });

你可以创建这样的键

在 Cloud Console 中打开 IAM 和管理页面。

打开 IAM 和管理页面

单击选择项目,选择一个项目,然后单击打开。

在左侧导航中,单击服务帐户。

找到要为其创建密钥的服务帐号所在的行。 在该行中,单击 More more_vert 按钮,然后单击创建密钥。

选择密钥类型并单击创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM