How to track user location when the app is killed using flutter?

240

Write Those code in your manifest file.Create BroadcastReceiver and service.

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

   <receiver
   android:name=".activity.Timerservice"
   android:process=":remote" >
   </receiver>

   <service
   android:name=".model.GPSTracker"
   android:exported="false" />

In your Main Activity create on method.for continues fix interval time get current lat-long

public void scheduleAlarm() {
    // Construct an intent that will execute the AlarmReceiver
    Intent intent = new Intent(getApplicationContext(), Timerservice.class);
    // Create a PendingIntent to be triggered when the alarm goes off
    pIntent = PendingIntent.getBroadcast(this, Timerservice.REQUEST_CODE,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Setup periodic alarm every 5 seconds
    long firstMillis = System.currentTimeMillis(); // alarm is set right away
    alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP
    // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
            60000, pIntent);

}

TimeService.java (BroadcastReceiver class)

public class Timerservice  extends BroadcastReceiver {
public static final int REQUEST_CODE = 12345;
Context mContext;
public static final String ACTION = "com.codepath.example.servicesdemo.alarm";

// Triggered by the Alarm periodically (starts the service to run task)
@Override
public void onReceive(Context context, Intent intent) {


    final LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    if ( !manager.isProviderEnabled(LocationManager.GPS_PROVIDER) ) {
        Intent i1 = new Intent(context, AlertDialogActivity.class);
        i1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i1);
        //   buildAlertMessageNoGps();
    }else{
        Intent i = new Intent(context, GPSTracker.class);
        context.startService(i);
    }
}

GPSTracker.class

public class GPSTracker extends Service implements LocationListener {
Context mContext;

// flag for GPS status
boolean isGPSEnabled = false;

// flag for network status
boolean isNetworkEnabled = false;

boolean canGetLocation = false;

Location location; // location
double latitude; // latitude
double longitude; // longitude

double Lastlatitude; // latitude
double Lastlongitude; // longitude

double totalDistance, Totalkm;

SessionManagement sessionManagement;

// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

// Declaring a Location Manager
protected LocationManager locationManager;

public GPSTracker() {
    //super("GPS");
}
public GPSTracker(Context mContext) {
    //super("");
    this.mContext = mContext;
    getLocation();
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        Criteria locationCritera = new Criteria();
        String providerName = locationManager.getBestProvider(locationCritera,
                true);
        if (providerName != null)
            location = locationManager.getLastKnownLocation(providerName);

        GPSTracker locationListener = new GPSTracker();

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                0, locationListener);


        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // First get location from Network Provider

            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                        Log.i("location", +latitude + " " + longitude);
                        // Toast.makeText(getApplicationContext(),"LatLang is" +latitude+" "+longitude,Toast.LENGTH_LONG).show();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

public void stopUsingGPS() {
    if (locationManager != null) {
        locationManager.removeUpdates(GPSTracker.this);
    }
}

public double getLatitude() {
    if (location != null) {
        latitude = location.getLatitude();
    }

    // return latitude
    return latitude;
}

public double getLongitude() {
    if (location != null) {
        longitude = location.getLongitude();
    }

    // return longitude
    return longitude;
}

public boolean canGetLocation() {
    return this.canGetLocation;
}


@Override
public void onLocationChanged(Location location) {
    if (location != null) {
        this.location = location;
        getLatitude();
        getLongitude();
    }
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}


@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {

}
@Override
public void onDestroy() {
    super.onDestroy();
}

}
Share:
240
Admin
Author by

Admin

Updated on January 04, 2023

Comments

  • Admin
    Admin over 1 year

    I want to create a project that tracks the user's location when the app is closed or the app is running and then sends user data to Firebase. I chose Flutter to create this project. I'm new in flutter. How to I develop this application? Help me with some advice or related guidelines so I can develop this application.

  • Admin
    Admin almost 2 years
    thank you for your suggestion @AnandhKrishnan I can fetch data when the app is running but I cannot fetch data when the app is closed. How can I fetch data when the app is closed?
  • Anandh Krishnan
    Anandh Krishnan almost 2 years
    try my another answer