Flutter : Google Sign In を試す。AndroidとiPhoneで。
Flutter + Firebase でアプリ開発の部品集め。Googleサインインを試す。
準備
https://pub.dev/packages/google_sign_in
- Android,iPhone アプリケーションを、Firebaseに登録
- 連絡先を取得するためには、Google People API を有効化
- iOS
- GoogleService-Info.plist をダウンロード
- KEY=CFBundleURLSchemes の array/string の内容を、上記でダウンロードした
KEY=REVERSED_CLIENT_ID の値に置き換え
pubspec.yaml
- 以下を追記
dependencies: : google_sign_in: 4.4.4
lib/main.dart
- メインメニューに、GoogleSignInWidgetへの遷移ボタンを配置
import 'dart:io'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_ml_vision/firebase_ml_vision.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:image_picker/image_picker.dart'; import 'package:image_cropper/image_cropper.dart'; import './google_sign_in.dart'; import './second.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { final message = "Initial Message."; @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Sample', home: MyHomePage(message:this.message), ); } } class MyHomePageState extends State{ @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.message) ), body: Column( children: [ Container( child: RaisedButton( child: Text("Google Signin"), onPressed: () => _pushPage(context, GoogleSignInWidget()), ), ), Container( child: RaisedButton( child: Text("Firestore, Cloud Vision"), onPressed: () => _pushPage(context, MyPage()), ), ) ], ) ); } void _pushPage(BuildContext context, Widget page) { Navigator.of(context).push( MaterialPageRoute (builder: (_) => page) ); } } class MyHomePage extends StatefulWidget { final String message; MyHomePage({this.message}):super() {} @override State createState() => new MyHomePageState(); }
lib/google_sign_in.dart
- https://pub.dev/packages/google_sign_in を参考にしてサインイン
- 連絡先を取得する権限を持たせ、取得したJSONを画面に表示させとく
import 'package:flutter/material.dart'; import 'package:google_sign_in/google_sign_in.dart'; import "package:http/http.dart" as http; import 'dart:convert' show json; GoogleSignIn _googleSignIn = GoogleSignIn( scopes: <String>[ 'email', 'https://www.googleapis.com/auth/contacts.readonly', ] ); class GoogleSignInWidget extends StatefulWidget { @override State<StatefulWidget> createState() => GoogleSignInWidgetState(); } class GoogleSignInWidgetState extends State<GoogleSignInWidget> { GoogleSignInAccount _currentUser; String _contactText; @override void initState() { super.initState(); _googleSignIn.onCurrentUserChanged.listen( (GoogleSignInAccount account) { setState(() { _currentUser = account; }); if (_currentUser != null) { _handleGetContact(); } } ); _googleSignIn.signInSilently(); } Future<void> _handleGetContact() async { setState(() { _contactText = "Loading contact info..."; }); final http.Response response = await http.get( 'https://people.googleapis.com/v1/people/me/connections' '?requestMask.includeField=person.names', headers: await _currentUser.authHeaders, ); final Map<String, dynamic> data = json.decode(response.body); print(data); } Future<void> _handleSignIn() async { try { await _googleSignIn.signIn(); } catch(error) { print(error); } } Future<void> _handleSignOut() => _googleSignIn.disconnect(); Widget _buildBody() { if (_currentUser != null) { return Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ ListTile( leading: GoogleUserCircleAvatar( identity: _currentUser, ), title: Text(_currentUser.displayName ?? ''), subtitle: Text(_currentUser.email ?? ''), ), const Text('サインイン成功'), Text(_contactText ?? ''), RaisedButton( child: const Text('SIGN OUT'), onPressed: _handleSignOut, ), RaisedButton( child: const Text('REFRESH'), onPressed: _handleGetContact, ), ], ); } else { return Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ const Text('現在サインインしていません。'), RaisedButton( child: const Text("Sign In"), onPressed: _handleSignIn, ), ], ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Google Sign In"), ), body: ConstrainedBox( constraints: const BoxConstraints.expand(), child: _buildBody(), ), ); } }
エラー対応
PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)
- SHA1フィンガープリントの設定
- https://console.developers.google.com/apis/library/people.googleapis.com?project=typea-gcp-api-trial&pli=1