flutterdartmock-location

How to detect mock location in flutter for ios and android


I am using package of location and google maps flutter in my screen and I want to detect wether user using fake gps or not.. Is there a package that can detect mock location in flutter that available in android and ios? I have tried using TrustFall package but my app always close unexpectedly.. is there another way to detect mock location in flutter?


Solution

  • you can use TrustLocation

    permissions:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    

    usage :

    import 'package:trust_location/trust_location.dart';
    
    /* Assuming in an async function */
    /// query the current location.
    LatLongPosition position = await TrustLocation.getLatLong;
    
    /// check mock location on Android device.
    bool isMockLocation = await TrustLocation.isMockLocation;
    

    using steam:

    // input seconds into parameter for getting location with repeating by timer.
    // this example set to 5 seconds.
    TrustLocation.start(5);
    
    /// the stream getter where others can listen to.
    TrustLocation.onChange.listen((values) =>
    print('${values.latitude} ${values.longitude} ${values.isMockLocation}')
    );
    
    /// stop repeating by timer
    TrustLocation.stop();
    

    Example:

    import 'package:flutter/material.dart';
    import 'dart:async';
    
    import 'package:flutter/services.dart';
    import 'package:trust_location/trust_location.dart';
    
    import 'package:location_permissions/location_permissions.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      String _latitude;
      String _longitude;
      bool _isMockLocation;
    
      /// initialize state.
      @override
      void initState() {
        super.initState();
        requestLocationPermission();
        // input seconds into parameter for getting location with repeating by timer.
        // this example set to 5 seconds.
        TrustLocation.start(5);
        getLocation();
      }
    
      /// get location method, use a try/catch PlatformException.
      Future<void> getLocation() async {
        try {
          TrustLocation.onChange.listen((values) => setState(() {
            _latitude = values.latitude;
            _longitude = values.longitude;
            _isMockLocation = values.isMockLocation;
          }));
    } on PlatformException catch (e) {
      print('PlatformException $e');
    }
    }
    
      /// request location permission at runtime.
      void requestLocationPermission() async {
        PermissionStatus permission =
            await LocationPermissions().requestPermissions();
        print('permissions: $permission');
        }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Trust Location Plugin'),
            ),
            body: Padding(
              padding: const EdgeInsets.all(20.0),
              child: Center(
              child: Column(
            children: <Widget>[
              Text('Mock Location: $_isMockLocation'),
              Text('Latitude: $_latitude, Longitude: $_longitude'),
             ],
           )),
         ),
       ),
     );
    }
    }
    

    for more information you can see https://pub.dev/packages/trust_location

    github link : https://github.com/wongpiwat/trust-location