How can location updates from FusedLocationProviderClient be processed with Work Manager?

后端 未结 1 1232
無奈伤痛
無奈伤痛 2020-12-06 02:30

First of all, I\'m a total Android noob. Have looked for solutions for some time now, but can\'t find any helpful hints in the right direction so far. This might be generall

相关标签:
1条回答
  • 2020-12-06 03:12

    Here I have create demo : LocationTracker-WorkManager

    MyWorker.java

    public class MyWorker extends Worker {
    
        private static final String TAG = "MyWorker";
    
        /**
         * The desired interval for location updates. Inexact. Updates may be more or less frequent.
         */
        private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
    
        /**
         * The fastest rate for active location updates. Updates will never be more frequent
         * than this value.
         */
        private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
                UPDATE_INTERVAL_IN_MILLISECONDS / 2;
        /**
         * The current location.
         */
        private Location mLocation;
    
        /**
         * Provides access to the Fused Location Provider API.
         */
        private FusedLocationProviderClient mFusedLocationClient;
    
        private Context mContext;
        /**
         * Callback for changes in location.
         */
        private LocationCallback mLocationCallback;
    
        public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
            super(context, workerParams);
            mContext = context;
        }
    
        @NonNull
        @Override
        public Result doWork() {
            Log.d(TAG, "doWork: Done");
    
                    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
                    mLocationCallback = new LocationCallback() {
                        @Override
                        public void onLocationResult(LocationResult locationResult) {
                            super.onLocationResult(locationResult);
                        }
                    };
    
                    LocationRequest mLocationRequest = new LocationRequest();
                    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
                    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
                    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    
                    try {
                        mFusedLocationClient
                                .getLastLocation()
                                .addOnCompleteListener(new OnCompleteListener<Location>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Location> task) {
                                        if (task.isSuccessful() && task.getResult() != null) {
                                            mLocation = task.getResult();
                                            Log.d(TAG, "Location : " + mLocation);
                                            mFusedLocationClient.removeLocationUpdates(mLocationCallback);
                                        } else {
                                            Log.w(TAG, "Failed to get location.");
                                        }
                                    }
                                });
                    } catch (SecurityException unlikely) {
                        Log.e(TAG, "Lost location permission." + unlikely);
                    }
    
                    try {
                        mFusedLocationClient.requestLocationUpdates(mLocationRequest, null);
                    } catch (SecurityException unlikely) {
                        //Utils.setRequestingLocationUpdates(this, false);
                        Log.e(TAG, "Lost location permission. Could not request updates. " + unlikely);
                    }
    
            } catch (ParseException ignored) {
    
            }
    
            return Result.success();
        }
    }
    

    How to start worker:

    PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
                                .addTag(TAG)
                                .build();
    WorkManager.getInstance().enqueueUniquePeriodicWork("Location", ExistingPeriodicWorkPolicy.REPLACE, periodicWork);
    

    Hope it will be helpful. Do let me know if you get any problem. Thanks.

    0 讨论(0)
提交回复
热议问题