Диспетчер заданий Firebase, не вызывающий onLocation, изменен в устройстве oreo - PullRequest
0 голосов
/ 23 апреля 2019

Следующий код работает нормально на устройствах Nougat, но в устройстве oreo он вызывает onStartJob() после определенного интервала, но не выполняет onLocationChanged.

Итак, Job Schedular частично выполняет свою работу в устройствах oreo, но кое-как, как onLocationChanged никогда не вызывается.

Создание диспетчера заданий

Как только пользователь дает разрешение на местоположение, я выполняю следующий код.

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job job = createJob(dispatcher);
dispatcher.mustSchedule(job);

Job Builder

  Job job = dispatcher.newJobBuilder()
                .setLifetime(Lifetime.FOREVER)
                .setService(LocationJobService.class)
                .setTag("Location-Job-package")
                .setReplaceCurrent(false)
                .setRecurring(true)
                .setTrigger(Trigger.executionWindow(200, 800))
                .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
                .setConstraints(Constraint.ON_ANY_NETWORK, Constraint.DEVICE_CHARGING)
                .build();
        return job;     

Класс обслуживания Loaction

public class LocationJobService extends JobService implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener{


    @Override
    public void onCreate() {
        super.onCreate();

        if (isGooglePlayServicesAvailable()) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();

            mGoogleApiClient.connect();
        }
    }

   @SuppressLint("MissingPermission")
    @Override
    public boolean onStartJob(JobParameters params) {

        Log.i(TAG, "onStartCommand: ");
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setFastestInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        this.params = params;
        return true;
    }   


    @Override
    public void onLocationChanged(Location location) {

        String storedLat, storedLng;
        //....
    }
...