Получите постоянное местоположение с помощью службы даже после того, как приложение было убито из последнего ящика

Я начал Службу с основной деятельности, например: -

Intent intent = new Intent(this, MyLocationService.class);
startService(intent);

Класс MyLocationService выглядит так: -

public class MyLocationService extends Service implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
    private static final String TAG = MyLocationService.class.getSimpleName();
    public static Location mCurrentLocation;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate: ");
        initiateGooglePlayService();
    }
    public void initiateGooglePlayService() {
        Log.e(TAG, "initiateGooglePlayService: ");
        if (isGooglePlayServicesAvailable()) {
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(5000);
            mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationRequest.setSmallestDisplacement(10.0f);
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
            mGoogleApiClient.connect();
        }
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG, "onBind: ");
        return null;
    }
    private boolean isGooglePlayServicesAvailable() {
        Log.e(TAG, "isGooglePlayServicesAvailable: ");
        int status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(getApplicationContext());
        return ConnectionResult.SUCCESS == status;
    }
    @Override
    public void onConnected(Bundle bundle) {
        Log.e(TAG, "onConnected: ");
        startLocationUpdates();
    }
    @Override
    public void onConnectionSuspended(int i) {
        Log.e(TAG, "onConnectionSuspended: ");
    }
    protected void startLocationUpdates() {
        Log.e(TAG, "startLocationUpdates: ");
        try {
            PendingResult<Status> pendingResult;
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                return;
            }
            pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                    mGoogleApiClient, mLocationRequest, this);
        } catch (IllegalStateException ignored) {
        }
    }
    @Override
    public void onLocationChanged(Location location) {
        Log.e(TAG, "onLocationChanged: " + location.getLongitude());
        if (mGoogleApiClient.isConnected()) {
            mCurrentLocation = location;
            Intent intent = new Intent("GPSLocationUpdates");
            intent.putExtra("location", location);
         LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
            Toast.makeText(this, "location", Toast.LENGTH_LONG).show();
        }
    }
    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e(TAG, "onConnectionFailed: ");
    }
}

Я никогда и нигде не останавливаю службу.

Но все же я не могу получить контроль над onLocationChange().

Мой мотив в том, что мне нужно постоянное местоположение для выполнения какой-то фоновой операции. Иногда это работало в леденце. Но это не работает в Marshmallow, Nougat и даже Kitkat. Я искал, но не мог получить правильное представление. Пожалуйста, дайте мне знать, где я ошибаюсь. Любое предложение принято.

Я использую следующую зависимость для местоположения: -

 compile 'com.google.android.gms:play-services-location:9.6.1'

person Kailas Bhakade    schedule 31.08.2017    source источник
comment
Я не могу говорить за всех, но если я закрою недавнее приложение, я хочу, чтобы оно закрылось и перестало запускать весь его код   -  person Nick    schedule 31.08.2017
comment
вы сталкиваетесь с этой проблемой на некоторых устройствах или на всех устройствах Marshmallow?   -  person Shashwat Gupta    schedule 31.08.2017
comment
@ ĜüptåŠhãsĥwæt иногда это работало на леденце, но не работало ни на одном другом устройстве. Я тестировал его в Nougat, Kitkat, Marshmallow.   -  person Kailas Bhakade    schedule 31.08.2017
comment
вы дали разрешения Marshmallow своему приложению ??   -  person Shaifali Rajput    schedule 31.08.2017
comment
@ShaifaliPundir ДА, даже я дал разрешение на определение местоположения в настройках устройства также для теста. Но это нормально.   -  person Kailas Bhakade    schedule 31.08.2017
comment
@NickA, вы правы, но я разрабатываю бизнес-приложение, поэтому необходимо выполнять некоторые операции в фоновом режиме.   -  person Kailas Bhakade    schedule 31.08.2017
comment
Проверьте этот stackoverflow.com/questions/28535703/   -  person Shailesh    schedule 31.08.2017
comment
@KilasBhakade ааа, ну внутренние приложения - другое дело :)   -  person Nick    schedule 31.08.2017
comment
Переместили ли вы свое устройство из одного места в другое, поскольку вы указали расстояние 10 футов. Ваше устройство должно перемещаться более чем на 10 футов, как указано в вашем коде.   -  person Sachin Gawai    schedule 31.08.2017
comment
@SachinGawai Да. Я сделал это также. Должен ли я изменить его 10 футов на что-то другое.   -  person Kailas Bhakade    schedule 31.08.2017
comment
@NickA да, есть предложения???   -  person Kailas Bhakade    schedule 31.08.2017
comment
@SachinGawai это не метр.   -  person chandil03    schedule 31.08.2017
comment
Да, сделайте это на 100 метров и посмотрите, что произойдет   -  person Sachin Gawai    schedule 31.08.2017
comment
@KilasBhakade попробуйте удалить строку `mlocationRequest.setSmallestDisplacement(10.0f);`.   -  person chandil03    schedule 31.08.2017
comment
Да, сделайте это на 100 метров и посмотрите, что произойдет   -  person Sachin Gawai    schedule 31.08.2017
comment
@ chandil03 хорошо, позвольте мне проверить.   -  person Kailas Bhakade    schedule 31.08.2017
comment
@ chandil03 отлично работает на всех устройствах после удаления этой строки - › mLocationRequest.setSmallestDisplacement(10.0f);` Большое спасибо, но не работает в Nougat.   -  person Kailas Bhakade    schedule 31.08.2017
comment
@KailasBhakade, ваш код также будет работать с этой строкой, но вам нужно переместить местоположение вашего устройства на 10 метров. Попробуйте написать тестовые примеры, используя макет местоположения.   -  person chandil03    schedule 31.08.2017
comment
@chandi03 окзз. Но что-то не так в коде или я должен сделать что-то еще? Потому что не работает для нуги.   -  person Kailas Bhakade    schedule 31.08.2017


Ответы (2)


Вы можете использовать HyperTrack SDK, чтобы получать обновления местоположения в фоновом режиме. Узнайте больше о надежности SDK здесь в различных условиях.

Сначала настройте SDK.

После настройки SDK вам просто нужно настроить обратный вызов для получения обновлений местоположения.

HyperTrack.setCallback(new HyperTrackEventCallback() {
@Override
public void onEvent ( @NonNull final HyperTrackEvent event){
    switch (event.getEventType()) {
        case HyperTrackEvent.EventType.LOCATION_CHANGED_EVENT:
            Log.d(TAG, "onEvent: Location Changed");
            HyperTrackLocation hyperTrackLocation = event.getLocation();
            LatLng latLng = hyperTrackLocation.getLatLng();
            updateCurrentLocationMarker(event.getLocation());
            break;
    }
}
}

(Отказ от ответственности: я работаю в HyperTrack.)

person Aman Jain    schedule 20.09.2017
comment
Поскольку Oreo наложил ограничение на фоновую службу, поэтому SDK необходимо сохранить липкое уведомление для запуска службы в качестве переднего плана. - person Aman Jain; 21.09.2017

person    schedule
comment
Это работает, даже если приложение было убито с недавнего времени. Потому что я ищу это. Если приложение находится в фоновом режиме, мой код сработал. - person Kailas Bhakade; 31.08.2017
comment
да, я буду работать, но помните, не звоните networkUtilObj.disconnectGoogleApiClient(); везде, где пример кода содержит одну и ту же строку - person yash786; 31.08.2017
comment
@KilasBhakade, если приложение было убито из списка последних приложений, вы не сможете сделать то, что вы ищете. Пока у вас не будет варианта использования, который может разбудить ваше приложение, запустив его из широковещательного приемника. - person chandil03; 31.08.2017
comment
@ chandi03 Хорошо, спасибо. - person Kailas Bhakade; 31.08.2017