В Oreo (8.0.0+) (API 26+), как получить обновление служб определения местоположения, когда приложение находится в фоновом режиме или убить

В Android O (8.0.0+) (API 26+), как получить обновление служб определения местоположения, когда приложение находится в фоновом режиме или отключено. В приложении Strava для Android (доступно в Play Store ), службы определения местоположения работают правильно, когда приложение находится в фоновом режиме или отключено. Мне нужно создать такую ​​​​же функциональность в моем приложении. Всякий раз, когда я запускаю службу, используя

startService(new Intent(this, GpsServices.class));

Затем метод onDestroy вызывается через 10 секунд, когда приложение находится в режиме ожидания (приложение находится в фоновом режиме или уничтожено). Ниже мой код.

public class GpsServices extends Service implements LocationListener, Listener {

    @Override
    public void onCreate() {
        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        if (mLocationManager != null) {
            mLocationManager.addGpsStatusListener(this);
        }
        if (mLocationManager != null) {
            mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                500,
                0,
                this);
        }    
    }

    public void onLocationChanged(Location location) {
        System.out.println("location = [" + location + "]");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // If we get killed, after returning from here, restart
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }

    /* Remove the locationlistener updates when Services is stopped */
    @Override
    public void onDestroy() {
        try {
            mLocationManager.removeUpdates(this);
            mLocationManager.removeGpsStatusListener(this);
            stopForeground(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Любая помощь будет оценена по достоинству.


person ketan dhopeshwarkar    schedule 15.01.2018    source источник
comment
Вы должны прочитать, как обрабатывать местоположение в фоновом режиме developer.android. com/about/версии/oreo/   -  person tyczj    schedule 15.01.2018
comment
Если вы можете предоставить решение, это было бы полезно. Я уже прочитал предоставленную вами ссылку. Но интерфейсы GeofencingApi и FusedLocationProviderApi устарели.   -  person ketan dhopeshwarkar    schedule 15.01.2018
comment
Пожалуйста, прочитайте ссылку, использование этих вещей не имеет ничего общего с реальной проблемой.   -  person tyczj    schedule 15.01.2018


Ответы (2)


Вы можете попробовать один из двух вариантов ниже или их комбинацию, которые решили мои проблемы, когда я столкнулся с ними.

Опция 1

Чтобы обновление местоположения продолжало работать в фоновом режиме, необходимо использовать LocationServices API с FusedLocationProviderClient в качестве описано здесь и здесь в документации или здесь в CODEPATH.

Вариант 2

Если вы должным образом прочитали документацию по Android Oreo 8.0 где-нибудь здесь, вы бы остановились на этом решении.

Шаг 1. Убедитесь, что вы запускаете службу в качестве службы переднего плана, как показано в приведенном ниже коде.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

            mainActivity.startService(new Intent(getContext(), GpsServices.class));
            mainActivity.startService(new Intent(getContext(), BluetoothService.class));
            mainActivity.startService(new Intent(getContext(), BackgroundApiService.class));
        }
        else {
            mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
            mainActivity.startForegroundService(new Intent(getContext(), BluetoothService.class));
            mainActivity.startForegroundService(new Intent(getContext(), BackgroundApiService.class));
        }

Шаг 2. Используйте уведомление, чтобы показать, что ваша служба запущена. Добавьте ниже строку кода в метод обслуживания onCreate.

@Override
public void onCreate() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForeground(NOTIFICATION_ID, notification);
    }
    ...
}

Шаг 3. Удалите notification, когда служба остановлена ​​или уничтожена.

@Override
public void onDestroy() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          stopForeground(true); //true will remove notification
    }
    ...
}

Одна проблема с Вариантом 2 заключается в том, что он будет отображать notification до тех пор, пока ваш GpsService не запустится на всех устройствах с Android Oreo 8.0.

Я уверен, что оба эти варианта будут работать, даже когда приложение находится в фоновом режиме или в состоянии уничтожения.

Я надеюсь, что это решение может решить вашу проблему.

person Amrut Bidri    schedule 16.01.2018
comment
Можем ли мы определить включение/выключение GPS до того, как запустим нашу службу переднего плана? - person moDev; 03.04.2018
comment
да. stackoverflow.com/questions/15778807/ - person Amrut Bidri; 04.04.2018
comment
Это (GPS) решение больше не работает для меня в версии 8.0. - person moDev; 05.04.2018
comment
@moDev Нашли ли вы какое-либо решение для обнаружения включения / выключения GPS в Android (Oreo) 8.0. Поскольку широковещательный приемник больше не используется для обнаружения включения/выключения GPS. Если вы нашли какое-либо решение, пожалуйста, напишите ответ. - person Suresh; 18.09.2018
comment
@Suresh В 8.0 невозможно определить включение / выключение GPS. - person moDev; 17.10.2018
comment
Что касается Варианта 1, разве вам не нужна служба, чтобы она работала в фоновом режиме? Это применимо для API 26 и выше? - person mechdon; 07.12.2018
comment
Для варианта 2, как только вы закроете приложение или перейдете к другому приложению, служба автоматически отключится системой Android. - person Harish; 15.02.2020

Ключом к решению этой проблемы является генератор уведомлений. Следующая ссылка описывает рабочее решение лучше, чем я могу обобщить:

https://hackernoon.com/android-location-tracking-with-a-service-80940218f561

person Luke Dupin    schedule 20.09.2018