Как я могу получить местоположение в фоновом режиме каждые 10 минут, даже если приложение не запущено? - PullRequest
0 голосов
/ 12 января 2020

Я работаю над небольшим приложением, которое отображает историю моего геолокации за год. Чтобы добиться этого, я получаю геолокацию каждые 10 минут в фоновом режиме, даже если приложение не работает. Для этого я попытался создать AlarmManager, который вызывает Сервис (который получает местоположение с помощью LocationManager) каждые 600000 мс (10 м). Это не сработало вообще, поэтому я заставил мой AlarmManager вызвать BroadcastReceiver, который затем вызывает Сервис. Но это не сработало. Я новичок в Службах, BroadcastReceivers и запланированных задачах ... Я искал в Google, как заставить это работать должным образом, как выполнять запланированные задачи, как правильно настроить AlarmManager, как получать местоположение каждые X минут в фоновом режиме, и др c. но я не нашел ни одного полезного учебника или ответов по StackOverflow. И вот я здесь. Как мне этого добиться?

Вот код, который я сейчас использую в своем проекте:

MainActivity. java:

private void startAlarmTimerTask() {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent alm = new Intent(this, LocationBroadcast.class);
        PendingIntent pendInt = PendingIntent.getBroadcast(this, 0, alm, 0);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 600000, pendInt);
    }

//Call startAlarmTimerTask(); in onCreate()

LocationBroadcast. java:

public class LocationBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Fetching location...", Toast.LENGTH_LONG);
        Intent serviceIntent = new Intent(context, LocationService.class);
        context.startService(serviceIntent);
    }
}

LocationService. java:

public class LocationService extends Service implements LocationListener {
    private SharedPreferences dataly;
    private LocationManager geolocation;

    @Override
    public void onCreate() {
        geolocation = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            geolocation.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, this);
        }
    }

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

    @Override
    public void onLocationChanged(Location location) {
        final double latitude = location.getLatitude();
        final double longitude = location.getLongitude();
        //Save latitude and longitude in SharedPreferences
        //Stop location updates
    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

1 Ответ

0 голосов
/ 12 января 2020

Попробуйте, вот как это делается:

1) Запишите эти коды в ваш файл манифеста. Создайте приемник и службу вещания.

  <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" />

2) В вашей основной деятельности создайте на method.for продолжает фиксировать интервал времени получить текущее значение долготы

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,
        6000000, pIntent);

 }

3) TimeService. java (класс приемника вещания)

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);
}
 }

   }

4) 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 publi c void onProviderDisabled (поставщик строк) {

}



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

}

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

}
@Override
 public void onDestroy() {
 super.onDestroy();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...