Обновление местоположения на основе состояния устройства

Мне нужно получить местоположение (с помощью API-интерфейса fusedlocation) пользователя после ActivityRecognition Определить пользовательское состояние (которое вызывается каждые 3 минуты), например IN_VEHICLE,ON_FOOT,RUNNING и т. Д.

На каждом событии мне нужно местоположение пользователя после регулярного интервала. Например:

если пользователь еще тогда setInterval(5*60*60*1000); и проверьте следующее обновление местоположения не ранее, чем через 5 часов. Но ActivityRecognation будет вызывать каждые 3 мин.

если пользователь работает, то setInterval(2*60*1000); и проверьте следующее обновление местоположения не раньше, чем через 2 минуты. Но ActivityRecognation будет вызывать каждые 3 мин.

если пользователь работает, то отправлять местоположение каждые 1 мин., если пользователь ведет, то отправлять местоположение каждые 15 мин.

Я пытался установить логическое значение false в onConnected ложно и верно на уровне класса. Но это всегда превращается в истину, потому что весь сервис Intent вызывается через 3 минуты.

if (startLocationFirst){
requestLocatonSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); 
  LocationAPIclient.connect();// RequestLocation and GoogleAPIClient won't call until device comes from another ActivityRecognation State running,walking etc. And keep Updating location every 5 hours.
              }

Выпуск, который я имею в настоящее время

  • ActivityRecognation Получает состояние пользователя каждые 3 минуты, но не должно входить в startLocationFirst логическое значение, пока оно не выйдет из другого состояния ActivityRecognation и не будет обновлять расположение, как установлено внутри startLocationFirst

Вот IntentService с FusedLocation

public class Activity_Recognized_Service extends IntentService implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks, LocationListener {
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public static final String TAG = "###RECOGNISED SRVCE###";
    Timer timer;
    GoogleApiClient LocationAPIclient;
    LocationRequest mLocationRequest;
    Location mCurrentLocation;
    boolean startLocationFirst=true;


    public Activity_Recognized_Service() {
        super("Activity_Recognized_Service");
    }

    public Activity_Recognized_Service(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d(TAG, "On Handle Intent");
        if (ActivityRecognitionResult.hasResult(intent)) {
            Log.d(TAG, "ActivityRecognition Has Result");
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            handleDetectedActivities(result.getProbableActivities());
            Navigation_Drawer nav = new Navigation_Drawer();
            nav.UserMovementResult(result);

        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"On Create Calling");
        if (LocationAPIclient == null) {
            Log.d(TAG, "Location API is NULL Value Of This ");
            LocationAPIclient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
        }

    }

    private void handleDetectedActivities(List<DetectedActivity> probableActivities) {

        for (DetectedActivity activity : probableActivities) {
            switch (activity.getType()) {
                case DetectedActivity.IN_VEHICLE:
                    Log.d(TAG, "In Vehicle " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("In Vehicle");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(10*60*1000,8*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                        if (startLocationFirst){
                            Log.d(TAG,"Start Location Update For Car");
                        }
                    }
                    break;
                case DetectedActivity.ON_BICYCLE:
                    Log.d(TAG, "On Bicycle " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("On Bicycle");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(7*60*1000,5*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                    }
                    break;
                case DetectedActivity.ON_FOOT:
                    Log.d(TAG, "On Foot " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("On Foot");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                    }
                    break;
                case DetectedActivity.RUNNING:
                    Log.d(TAG, "On Running " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Running");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                    }
                    break;
                case DetectedActivity.STILL:
                    Log.d(TAG, "On Still " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Still");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());

                            requestLocatonSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                          //  requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                            LocationAPIclient.connect();


                    }
                    break;
                case DetectedActivity.TILTING:
                    Log.d(TAG, "On Tilting " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Tilting");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());

                        requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                        LocationAPIclient.connect();
                    }
                    break;
                case DetectedActivity.WALKING:
                    Log.d(TAG, "On Walking " + activity.getConfidence());
                    if (activity.getConfidence() >= 75) {
                        //Send Notification To User
                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                        builder.setContentText("Let's Walk");
                        builder.setSmallIcon(R.drawable.elaxer_x);
                        builder.setContentTitle("Elaxer");
                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        requestLocatonSetting(3*60*1000,2*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        LocationAPIclient.connect();

                    }
                    break;
                case DetectedActivity.UNKNOWN:
                    Log.d(TAG, "UnKnown " + activity.getConfidence());
                    break;
            }
        }
    }

    public void setTimer(int Minutes) {
        Log.d(TAG, "==================================================");
        Log.d(TAG, "Set Timeer Starts It will Run Every " + Minutes);
        int MilliSeconds = 60000 * Minutes;
        final Handler handler = new Handler();
        timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        try {
                            //CODE THAT YOU WANT TO EXECUTE AT GIVEN INTERVAL


                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, MilliSeconds);
        Log.d(TAG, "==================================================");
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.d(TAG, "On Connected Running");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
         mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(LocationAPIclient);
        if (mCurrentLocation!=null){
            Log.d(TAG,"Last Known Location Is not Null ");
            new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
        }
        else {
            Log.d(TAG,"Last Known Location Is NULL Start Location Updates");
            LocationServices.FusedLocationApi.requestLocationUpdates(LocationAPIclient,mLocationRequest,this);
        }

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d(TAG,"On Location Changed Calling");
        mCurrentLocation=location;
        new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
        Log.d(TAG,"Stopping Location Update");
       // LocationServices.FusedLocationApi.removeLocationUpdates(LocationAPIclient,this);
    }

    public void requestLocatonSetting(int Interval,int FastestInterval,int LocationAccuracy){
        mLocationRequest=new LocationRequest();
        mLocationRequest.setInterval(Interval);
        mLocationRequest.setFastestInterval(FastestInterval);
        mLocationRequest.setPriority(LocationAccuracy);

    }

}

2 ответа

Решение

Я выполняю этот код после добавления нескольких строк в тот же код, что и выше.

  • Сначала я объявляю static int на уровне класса в IntentService так как DectectedActivity.getType() вернуть инт. static int detectedActivity;
  • Затем я проверяю его состояние, как в прошлом if (activity.getConfidence() >= 75 && activity.getType()!=detectedActivity)

Вот и все. Спасибо @Pablo Baxter, который дал мне какую-то логику для применения. Я проверил это на IntentService но мне нужно проверить его на службе, чтобы я мог обновлять местоположения. Скоро будет обновление.

РЕДАКТИРОВАТЬ

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

Используйте этот сервис при регистрации ActivityRecognitionApi:

public class LocationUpdateService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    public static final String TAG = "###RECOGNISED SRVCE###";

    private GoogleApiClient apiClient;
    private PendingIntent pendingIntent;
    private DetectedActivity lastActivity;

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

    @Override
    public void onCreate() {
        apiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        apiClient.connect();
        pendingIntent = PendingIntent.getService(this, 1, new Intent(this, YourIntentService.class), PendingIntent.FLAG_UPDATE_CURRENT);
    }

    @Override
    public int onStartCommand(Intent intent, int flag, int startId) {
        Log.d(TAG, "onStartCommand");
        if (ActivityRecognitionResult.hasResult(intent)) {
            Log.d(TAG, "ActivityRecognition Has Result");
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            handleDetectedActivity(result);

            /* You should really use LocalBroadcastManager to send events out to an activity for UI updates */

//            Navigation_Drawer nav = new Navigation_Drawer();
//            nav.UserMovementResult(result);
        }
        return START_STICKY;
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.d(TAG, "On Connected Running");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Location location = LocationServices.FusedLocationApi.getLastLocation(apiClient);
        if (location!=null){
            Log.d(TAG,"Last Known Location Is not Null ");
            Intent intent = new Intent(this, YourIntentService.class).putExtra("lastKnown", location);
            startService(intent);

            /* No more need for this! */
//            new Location_sendeToServer_AsyncTask(this).execute(String.valueOf(mCurrentLocation.getLatitude()),String.valueOf(mCurrentLocation.getLongitude()),String.valueOf(mCurrentLocation.getAccuracy()));
        }
        else {
            Log.d(TAG,"Last Known Location Is NULL Start Location Updates");
            updateLocationSetting(5*60*60*1000,3*60*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY);
//            LocationServices.FusedLocationApi.requestLocationUpdates(apiClient,mLocationRequest,this);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    private void handleDetectedActivity(ActivityRecognitionResult result) {
        DetectedActivity mostProbableActivity = result.getMostProbableActivity();
        switch (result.getMostProbableActivity().getType()) {
            case DetectedActivity.IN_VEHICLE:
//                    Log.d(TAG, "In Vehicle " + activity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                        builder.setContentText("In Vehicle");
//                        builder.setSmallIcon(R.drawable.elaxer_x);
//                        builder.setContentTitle("Elaxer");
//                        NotificationManagerCompat.from(this).notify(0, builder.build());
                    //requestLocatonSetting(6*60*1000,6*60*1000,LocationRequest.PRIORITY_HIGH_ACCURACY); //TEST
                    if (apiClient.isConnected()) {
                        updateLocationSetting(10 * 60 * 1000, 8 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;
            case DetectedActivity.ON_BICYCLE:
                Log.d(TAG, "On Bicycle " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("On Bicycle");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());
                    if (apiClient.isConnected()) {
                        updateLocationSetting(7 * 60 * 1000, 5 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;

            case DetectedActivity.ON_FOOT:
                Log.d(TAG, "On Foot " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75) {
                    DetectedActivity nextHighest = result.getProbableActivities().get(1);
                    if (nextHighest.getType() == DetectedActivity.RUNNING && nextHighest != lastActivity) {
                        Log.d(TAG, "On Running " + mostProbableActivity.getConfidence());
                        //Send Notification To User
//                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                        builder.setContentText("Running");
//                        builder.setSmallIcon(R.drawable.elaxer_x);
//                        builder.setContentTitle("Elaxer");
//                        NotificationManagerCompat.from(this).notify(0, builder.build());
                        if (apiClient.isConnected()) {
                            updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                            lastActivity = nextHighest;
                        }
                    }
                    else if (nextHighest.getConfidence() >= 75 && nextHighest != lastActivity) {
                        Log.d(TAG, "On Walking " + mostProbableActivity.getConfidence());
                        //Send Notification To User
//                        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                        builder.setContentText("Let's Walk");
//                        builder.setSmallIcon(R.drawable.elaxer_x);
//                        builder.setContentTitle("Elaxer");
//                        NotificationManagerCompat.from(this).notify(0, builder.build());

                        if (apiClient.isConnected()) {
                            updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                            lastActivity = nextHighest;
                        }
                    }
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("On Foot");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());
                }
                break;
            case DetectedActivity.STILL:
                Log.d(TAG, "On Still " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("Still");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());

                    if (apiClient.isConnected()) {
                        updateLocationSetting(5 * 60 * 60 * 1000, 3 * 60 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;
            case DetectedActivity.TILTING:
                Log.d(TAG, "On Tilting " + mostProbableActivity.getConfidence());
                if (mostProbableActivity.getConfidence() >= 75 && mostProbableActivity != lastActivity) {
                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("Tilting");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());

                    if (apiClient.isConnected()) {
                        updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
                        lastActivity = mostProbableActivity;
                    }
                }
                break;
//            case DetectedActivity.WALKING:
//                Log.d(TAG, "On Walking " + mostProbableActivity.getConfidence());
//                if (mostProbableActivity.getConfidence() >= 75) {
//                    //Send Notification To User
//                    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//                    builder.setContentText("Let's Walk");
//                    builder.setSmallIcon(R.drawable.elaxer_x);
//                    builder.setContentTitle("Elaxer");
//                    NotificationManagerCompat.from(this).notify(0, builder.build());
//
//                    if (apiClient.isConnected()) {
//                        updateLocationSetting(3 * 60 * 1000, 2 * 60 * 1000, LocationRequest.PRIORITY_HIGH_ACCURACY); //5 hours= hours * 60 min*60 sec* 1000 milliseconds
//                    }
//                }
//                break;
            case DetectedActivity.UNKNOWN:
                Log.d(TAG, "UnKnown " + mostProbableActivity.getConfidence());
                lastActivity = mostProbableActivity;
                break;
        }
    }

    private void updateLocationSetting(int Interval, int FastestInterval, int LocationAccuracy) {
        LocationRequest request = new LocationRequest();
        request.setInterval(Interval);
        request.setFastestInterval(FastestInterval);
        request.setPriority(LocationAccuracy);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED) {
            //TODO DO SOMETHING HERE!
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, pendingIntent);
    }
}

И это будет использовать IntentService вместо AsyncTask, который вы использовали:

public class YourIntentService extends IntentService {

    public YourIntentService() {
        super("YOUR_INTENT_SERVICE");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (intent != null) {
            if (LocationResult.hasResult(intent)) {
                LocationResult result = LocationResult.extractResult(intent);
                Location location = result.getLastLocation();
                Log.d("YourIntentService", "Got new location: " + location);
            }
            else if (intent.hasExtra("lastKnown")) {
                Location location = intent.getParcelableExtra("lastKnown");
                Log.d("YourIntentService", "Got last known location: " + location);
            }
            else if (LocationAvailability.hasLocationAvailability(intent)) {
                LocationAvailability locationAvailability = LocationAvailability.extractLocationAvailability(intent);
                Log.d("YourIntentService", "Location Availability: " + locationAvailability.isLocationAvailable());
            }
        }
    }
}

Эта служба намерений может обрабатывать сетевые запросы, если они вызываются в onHandleIntent,

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


Во-первых, я бы не советовал вам использовать IntentService как вы сейчас, так как служба будет убита, как только она выйдет onHandleIntent, что может вызвать много проблем, так как вы полагаетесь на обратные вызовы. Все это должно быть помещено в Service вместо.

Что касается обработки обновлений местоположения на основе распознавания активности, я обнаружил, что это хорошая библиотека, которая упрощает это и довольно проста в использовании. https://github.com/mrmans0n/smart-location-lib

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

SmartLocation.with(this).location(new LocationBasedOnActivityProvider(new LocationBasedOnActivityProvider.LocationBasedOnActivityListener() {
    @Override
    public LocationParams locationParamsForActivity(DetectedActivity detectedActivity) {
        if (detectedActivity.getConfidence() >= 75) {
            LocationParams.Builder builder = new LocationParams.Builder();
            switch (detectedActivity.getType()) {
                case DetectedActivity.IN_VEHICLE:
                    builder.setInterval(/*Interval*/)
                            .setAccuracy(/*Locaiton Accuracy*/);
                    break;

                case DetectedActivity.ON_BICYCLE:
                    /* So on and so forth.... */

                    break;
            }
            return builder.build();
        }
        return null;
    }
})).start(new OnLocationUpdatedListener() {
    @Override
    public void onLocationUpdated(Location location) {
        //Do what you need here.
    }
});

Это должно быть сброшено в Service в onStart функция, с onStartCommand обработка изменений в зависимости от ваших намерений. Вы также можете использовать эту библиотеку, чтобы получить последнее известное местоположение и получить одно исправление.

И последнее, я бы порекомендовал вам уйти от AsyncTask если вы передаете контексты этому. Вместо этого используйте IntentService, так как onHandleIntent Функция запускается в фоновом потоке, и вы можете использовать IntentService контекст для выполнения любых задач, которые вам нужны с ним. Вы можете передать Location объект в качестве дополнительного в намерении, когда вы начинаете свой IntentService,

Другие вопросы по тегам