javaandroidfirebaseflutterfirebase-authentication

Unhandled Exception: PlatformException (sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null) - works well in one system


I am developing a Bluetooth application using platform channel in flutter (using Java). But while I try to login with google-sign in( google_sign_in: ^4.5.6 ) I'm getting the error. I can login the details but I can't move to further page...... Actually, it's working in my office system, but when I copy the project and run in another it gives the error...Can anyone please help

main.dart
import 'package:bmsapp2/pages/loginpage.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(BmsApp());
}

class BmsApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    const curveHeight = 12.0;
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          appBar: AppBar(
            backgroundColor: Colors.amber[900],
            shape: const MyShapeBorder(curveHeight),
          ),
          body: LoginPage(),
        ),
      ),
    );
  }
}

class MyShapeBorder extends ContinuousRectangleBorder {
  const MyShapeBorder(this.curveHeight);
  final double curveHeight;

  @override
  Path getOuterPath(Rect rect, {TextDirection textDirection}) => Path()
    ..lineTo(0, rect.size.height)
    ..quadraticBezierTo(
      rect.size.width / 2,
      rect.size.height + curveHeight * 2,
      rect.size.width,
      rect.size.height,
    )
    ..lineTo(rect.size.width, 0)
    ..close();
}

loginpage.dart
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:avatar_glow/avatar_glow.dart';

import 'bluetoothpage.dart';

final GoogleSignIn googleSignIn = GoogleSignIn(scopes: ['profile', 'email']);

class LoginPage extends StatefulWidget {
  LoginPage({Key key}) : super(key: key);

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  bool isAuth = false;
  GoogleSignInAccount _currentUser;

  Widget buildAuthScreen() {
    //return Text(_currentUser.displayName ?? '');
    return SafeArea(
      child: Center(
        child: Container(
          margin: EdgeInsets.only(top: 50),
          child: Column(
            //mainAxisAlignment: MainAxisAlignment.center,
            children: [
              CircleAvatar(
                backgroundColor: Colors.white,
                backgroundImage: NetworkImage(_currentUser.photoUrl),
                radius: 50,
              ),
              SizedBox(height: 15),
              Text(
                'You are logged in as ',
                style: TextStyle(
                  color: Colors.grey,
                  fontSize: 15,
                ),
              ),
              SizedBox(height: 5),
              Text(
                _currentUser.email,
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 15,
                  fontWeight: FontWeight.bold,
                ),
              ),
              ElevatedButton(
                onPressed: _logout,
                child: Text("Logout".toUpperCase(),
                    style: TextStyle(fontSize: 14, letterSpacing: 2)),
                style: ButtonStyle(
                    foregroundColor:
                        MaterialStateProperty.all<Color>(Colors.white),
                    backgroundColor:
                        MaterialStateProperty.all<Color>(Colors.amber[900]),
                    shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                        RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(5),
                            side: BorderSide(color: Colors.amber[900])))),
              ),
              Container(
                // height: 300,
                child: AvatarGlow(
                  glowColor: Colors.blue,
                  endRadius: 70.0,
                  duration: Duration(milliseconds: 2000),
                  repeat: true,
                  showTwoGlows: true,
                  repeatPauseDuration: Duration(milliseconds: 100),
                  child: Material(
                    elevation: 4.0,
                    shape: CircleBorder(),
                    child: CircleAvatar(
                      backgroundColor: Colors.grey[200],
                      child: Image.asset(
                        'images/bt.png',
                        height: 40,
                        width: 250,
                        fit: BoxFit.fitWidth,
                      ),
                      radius: 40.0,
                    ),
                  ),
                ),
              ),
              ElevatedButton(
                onPressed: () {
                  Navigator.push(context,
                      MaterialPageRoute(builder: (context) => BluetoothPage()));
                },
                child: Text('Find your device',
                    style: TextStyle(fontSize: 15, letterSpacing: 2)),
                style: ButtonStyle(
                    foregroundColor:
                        MaterialStateProperty.all<Color>(Colors.white),
                    backgroundColor:
                        MaterialStateProperty.all<Color>(Colors.amber[900]),
                    shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                        RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(5),
                            side: BorderSide(color: Colors.amber[900])))),
              ),
            ],
          ),
        ),
      ),
    );
  }

  _login() {
    googleSignIn.signIn();
  }

  _logout() {
    googleSignIn.signOut();
  }

  Widget buildUnAuthScreen() {
    return Scaffold(
        body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Container(
            child: Image.asset('images/touch.png'),
          ),
          SizedBox(
            height: 5.0,
          ),
          Text(
            'Next Generation Battery',
            style: TextStyle(fontSize: 15, color: Colors.grey),
          ),
          SizedBox(
            height: 5.0,
          ),
          Container(
            child: GestureDetector(
              onTap: () {
                _login();
              },
              child: Image.asset(
                'images/signin.png',
                height: 75,
                width: 250,
                fit: BoxFit.fitWidth,
              ),
            ),
          ),
          Text(
            'Sign up here',
            style: TextStyle(fontSize: 15, color: Colors.grey),
          ),
        ],
      ),
    ));
  }

  void handleSignin(GoogleSignInAccount account) {
    if (account != null) {
      print('User Signed in $account');

      setState(() {
        isAuth = true;
        _currentUser = account;
      });
    } else {
      setState(() {
        isAuth = false;
        //_currentUser = null;
      });
    }
  }

  @override
  void initState() {
    super.initState();

    googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
      handleSignin(account);
    }, onError: (err) {
      print('Error Signiing in : $err');
    });
    // Reauthenticate user when app is opened
    /*googleSignIn.signInSilently(suppressErrors: false).then((account) {
      handleSignin(account);
    }).catchError((err) {
      print('Error Signiing in : $err');
    });*/
  }

  @override
  Widget build(BuildContext context) {
    return isAuth ? buildAuthScreen() : buildUnAuthScreen();
  }
}

error:
E/flutter (12476): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)
E/flutter (12476): #0      StandardMethodCodec.decodeEnvelope
package:flutter/…/services/message_codecs.dart:581
E/flutter (12476): #1      MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:158
E/flutter (12476): <asynchronous suspension>
E/flutter (12476): #2      MethodChannel.invokeMapMethod
package:flutter/…/services/platform_channel.dart:358
E/flutter (12476): <asynchronous suspension>
E/flutter (12476):
D/ViewRootImpl@4370975[SignInHubActivity](12476): mHardwareRenderer.destroy()#1
D/ViewRootImpl@4370975[SignInHubActivity](12476): Relayout returned: oldFrame=[0,0][1440,2560] newFrame=[0,0][1440,2560] result=0x5 surface={isValid=false 0} surfaceGenerationChanged=true
D/ViewRootImpl@4370975[SignInHubActivity](12476): mHardwareRenderer.destroy()#4
D/ViewRootImpl@4370975[SignInHubActivity](12476): dispatchDetachedFromWindow
D/InputTransport(12476): Input channel destroyed: fd=102


Solution

  • [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null) apiException:10 means it's most likely due to incorrect setup of SHA-1 or SHA-256. Since you said that it works at the office, it's probably a different environment than what you are working with now, and you should add these keys. This is also assuming that you are running a debug build, so add your debugging SHA-1 keys.