GeofencingClient не запускается при закрытии приложения - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу прослушивать местоположение пользователя каждые 500 м. Изменений, чтобы я использовал службу переднего плана (из-за ограничений Oreo) и.Я начал геозону, когда удаляю приложение из списка (убивает). Я видел, что когда приложение на переднем плане, его местоположение вызывает геозону, но приложение на фоне не срабатывает.

Примечание: когда приложение на фоне, и я пыталсяоткройте приложение Google Maps, оно было запущено

, кто может мне помочь в этом?

ServiceClass:

  public enum ServiceAction {

    JUSTSTART("RECEIVE_ACTION_JUSTSTART"),
    GEOFENCING("RECEIVE_ACTION_GEOFENCING");

    private String action;

    ServiceAction(String action) {
        this.action = action;
    }

    public String getAction() {
        return action;
    }

    public static ServiceAction getActionByName(String action) {
        if(JUSTSTART.getAction().equals(action)) {
            return JUSTSTART;
        }else if(GEOFENCING.getAction().equals(action)){
            return GEOFENCING;
        }else {
            return null;
        }
    }
}

private static final int DRIVERSTATUSSERVICE_ID = 201;
private FirebaseDatabase dbInstance;
private DatabaseReference ref;
private ValueEventListener statuEventListener;
private String userName;
private DriverConstants.DriverStatus status;
private static final String CHANNEL = "DRIVERSTATUSSERVICE__CHANNEL";
private static final String GEOFENCE_REQUESTID = "GEOFENCING_REQUESTID.";
private boolean serviceStopped = false;
private FusedLocationProviderClient fusedLocationProviderClient;
private GeofencingClient mGeofencingClient;
private PendingIntent mGeofencePendingIntent;
public static final float GEOFENCING_RADIUS = 500;

public boolean isFirstStart = true;

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
    if(isFirstStart) {
        isFirstStart = false;
        startNotificationAndForeGround(!MyApplication.driverActivityStarted);
    }
    if(userName == null) {
        if(UserCognito.getInstance(getApplicationContext()).getUserName() == null) {
            getUserSessionInBackground(DriverStatusService.this, new CallBackService() {
                @Override
                public void onSuccess() {
                    userName = UserCognito.getInstance(getApplicationContext()).getUserName();
                    workStartLogics(intent);
                }

                @Override
                public void onFail() {

                }
            });
        }else {
            userName = UserCognito.getInstance(getApplicationContext()).getUserName();
            workStartLogics(intent);
        }
    }else {
       workStartLogics(intent);
    }
    return START_REDELIVER_INTENT;
}

@Override
public void onCreate() {
    super.onCreate();
    initChannels(getApplicationContext());
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (ref != null) {
        ref.removeEventListener(statuEventListener);
        ref = null;
    }
    if(mGeofencingClient != null && mGeofencePendingIntent != null) {
        mGeofencingClient.removeGeofences(mGeofencePendingIntent);
    }
    if (!serviceStopped) { //onTaskRemoved dan sonra burası çalışabilir  (bazı caselerde) bazen sadece burası çalışır
        stopForeGroundAndSelf();
    }
}

private void workStartLogics(Intent intent) {
    ServiceAction action = ServiceAction.getActionByName(intent.getAction());
    if(ServiceAction.GEOFENCING == action && !MyApplication.driverActivityStarted) {
        getLastLocationAndStartGeofencing();
    }
    listenDriverStatus(intent);
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    MyApplication.driverActivityStarted = false;
    if (status == DriverConstants.DriverStatus.WAITING) {
        startNotificationAndForeGround(true);
        getLastLocationAndStartGeofencing();
    } else {
        stopForeGroundAndSelf();
    }
}

private void getLastLocationAndStartGeofencing() {
    if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    getFusedLocationProviderClient().getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
        @Override
        public void onComplete(@NonNull Task<Location> task) {
            sendDriverLocation(task.getResult());
            startNewGeofencing(task.getResult());
        }
    });
}

@Override
public void onConnected(@Nullable Bundle bundle) {

}

@Override
public void onConnectionSuspended(int i) {

}

private void startNewGeofencing(Location lastLocation) {
    if(lastLocation == null) {
        return;
    }
    mGeofencingClient = LocationServices.getGeofencingClient(DriverStatusService.this);
    Geofence g = new Geofence.Builder()
            .setRequestId(GEOFENCE_REQUESTID)
            .setCircularRegion(
                    lastLocation.getLatitude(),
                    lastLocation.getLongitude(),
                    GEOFENCING_RADIUS)
            .setLoiteringDelay(0)
            .setExpirationDuration(Geofence.NEVER_EXPIRE)
            .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT).build();
    if (ContextCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    mGeofencingClient.addGeofences(getGeofencingRequest(g), getGeofencePendingIntent())
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {

        }
    }).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {

        }
    });
}

private GeofencingRequest getGeofencingRequest(Geofence g) {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER | GeofencingRequest.INITIAL_TRIGGER_EXIT);
    builder.addGeofence(g);
    return builder.build();
}

private PendingIntent getGeofencePendingIntent() {
    if (mGeofencePendingIntent != null) {
        mGeofencingClient.removeGeofences(mGeofencePendingIntent);
        return mGeofencePendingIntent;
    }
    Intent intent = new Intent(DriverStatusService.this, GeofenceBroadcastReceiver.class);
    intent.setAction("ahmetvefasaruhan");
    mGeofencePendingIntent = PendingIntent.getBroadcast(DriverStatusService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    return mGeofencePendingIntent;
}

private void startNotificationAndForeGround(boolean appOnBackground) {
    Intent notificationIntent = appOnBackground ? ActivityUtil.getSplashActivityIntent(DriverStatusService.this) :  ActivityUtil.getDriverActivityIntent(DriverStatusService.this);
    PendingIntent pendingIntent =
            PendingIntent.getActivity(this, 0, notificationIntent, 0);

    NotificationCompat.Builder notificationCompat =
            new NotificationCompat.Builder(this.getApplicationContext(), CHANNEL)
                    .setContentText("Çevredeki müşterilerle eşleşmeye hazırsın")
                    .setContentIntent(pendingIntent)
                    .setLocalOnly(true);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        notificationCompat.setSmallIcon(R.drawable.ic_white_icon);
        notificationCompat.setColor(getResources().getColor(R.color.appColor));
    } else {
        notificationCompat.setSmallIcon(R.mipmap.ic_launcher);
    }
    Notification notification = notificationCompat.build();
    startForeground(DRIVERSTATUSSERVICE_ID, notification);
}

public void initChannels(Context context) {
    if (Build.VERSION.SDK_INT < 26) {
        return;
    }
    NotificationManager notificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationChannel channel = new NotificationChannel(CHANNEL, "Foreground channel",
            NotificationManager.IMPORTANCE_DEFAULT);
    channel.setDescription("Channel for foreground service");
    notificationManager.createNotificationChannel(channel);
}

private void listenDriverStatus(Intent intent) {
    if (intent != null) {
        dbInstance = FirebaseDatabase.getInstance();
        if (ref == null) {
            ref = dbInstance.getReference(FIREBASE_TAXI_URI).child(userName).child("st");
            statuEventListener = new ValueEventListener() { //daima dinlenecek
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Long st = dataSnapshot.getValue(Long.class);
                    status = DriverConstants.DriverStatus.getStatusByNumber(st.intValue());
                    if(status == null) {
                        return;
                    }
                    switch (status) {
                        case WAITING_TO_ACCEPT: //2 eşleştirme isteği gönderildi
                            startActivity(ActivityUtil.getDriverActivityIntent(DriverStatusService.this));
                            break;
                        default:
                            break;
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            };
            ref.addValueEventListener(statuEventListener);
        }
    }
}

private void sendDriverLocation(Location lastLocatio) {
    if(lastLocatio == null) {
        return;
    }
    callAwsFunction(new SendLocationRequestDTO(userName,lastLocatio.getLatitude(),lastLocatio.getLongitude(),"T",null), com.example.ahmetvefa53.heremapapp.awsServices.DriverService.class, BaseAwsResponseDTO.class, new ServiceCall<SendLocationRequestDTO, BaseAwsResponseDTO, com.example.ahmetvefa53.heremapapp.awsServices.DriverService>() {
        @Override
        public BaseAwsResponseDTO callServiceMethod(com.example.ahmetvefa53.heremapapp.awsServices.DriverService myInterface, SendLocationRequestDTO param) {
            return myInterface.sendLocation(param);
        }
    }, new OnSuccess<BaseAwsResponseDTO>() {
        @Override
        public void OnSuccess(BaseAwsResponseDTO response) {

        }
    }, new OnFailure() {
        @Override
        public void onFailure(BaseAwsErrorDTO errorDTO) {

        }
    });
}

private void stopForeGroundAndSelf() {
    serviceStopped = true;
    stopForeground(true);
    stopSelf();
}

private FusedLocationProviderClient getFusedLocationProviderClient() {
    if (fusedLocationProviderClient == null) {
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(DriverStatusService.this);
    }
    return fusedLocationProviderClient;
}

GeofenceBroadcastReceiver:

  @Override
public void onReceive(Context context, Intent intent) {
    handleGeofencing(context,intent);
}

private void handleGeofencing(Context context,Intent intent) {
    GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
    if (geofencingEvent.hasError()) {
        int errorCode = geofencingEvent.getErrorCode();
        Log.e("GEOFENCE_ERROR", GeofenceStatusCodes.getStatusCodeString(errorCode));
    }
    switch (geofencingEvent.getGeofenceTransition()) {
        case Geofence.GEOFENCE_TRANSITION_EXIT:
            Intent i = new Intent(context, DriverStatusService.class);
            i.setAction(DriverStatusService.ServiceAction.GEOFENCING.getAction());
            ContextCompat.startForegroundService(context.getApplicationContext(),i);
            break;
        default:
            break;

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...