Захватить местоположение из фона и загрузить его в облако или сохранить в локальном хранилище в Android - PullRequest
0 голосов
/ 14 марта 2019

Я хочу создать приложение для Android, которое может фиксировать местоположение устройства, даже если оно не запущено. Я пытался создать приложение, которое возвращает данные из службы в основной поток. Это приложение работает нормально, когда оно запущено, но если оно закрыто, оно не захватывает местоположение.

Я прикрепил свой класс обслуживания. Теперь он просто фиксирует местоположение и обновляет интерфейс. работает , даже когда приложение находится в пауза . но не работает , когда приложение уничтожено .

public class DeviceLocationService extends Service {

private LocationListener listener;
private LocationManager locationManager;
private final String TAG = this.getClass().getName();
private int count = 0;

@SuppressLint("MissingPermission")
@Override
public void onCreate() {
    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            Intent i = new Intent(Config.LOCATION_INTENT_FILTER);
            HashMap<Object,Object> hashMap = new HashMap<>();
            Log.d(TAG, "onAccuracyChanged: "+location.getAccuracy());

            hashMap.put("latitude",location.getLatitude());
            hashMap.put("longitude",location.getLongitude());
            hashMap.put("accuracy",location.getAccuracy());
            hashMap.put("provider",location.getProvider());

            JSONObject jo = new JSONObject(hashMap);
            i.putExtra("location_data",jo.toString());
            Log.d(TAG, "onLocationChanged: "+jo.toString());
            sendBroadcast(i);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.d(TAG, "onStatusChanged: provider "+provider);
            Log.d(TAG, "onStatusChanged: status "+status);
        }

        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "onProviderEnabled: "+provider);
        }

        @Override
        public void onProviderDisabled(String provider) {
            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
    };

    locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    if (locationManager != null) {
        //noinspection MissingPermission
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,listener);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,listener);
    }
}

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

}

1 Ответ

1 голос
/ 14 марта 2019

Чтобы запустить свой сервис в фоновом режиме, вам нужно использовать сервис переднего плана.

добавить код ниже в вашем сервисе

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        startMyOwnForeground();
    else
        startForeground(1, new Notification());
    return START_STICKY;
}

@RequiresApi(api = Build.VERSION_CODES.O)
private void startMyOwnForeground(){
    String NOTIFICATION_CHANNEL_ID = "com.example.simpleapp";
    String channelName = "My Background Service";
    NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
    chan.setLightColor(Color.BLUE);
    chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    assert manager != null;
    manager.createNotificationChannel(chan);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
    Notification notification = notificationBuilder.setOngoing(true)
            .setSmallIcon(R.drawable.ic_launcher_background)
            .setContentTitle("App is running in background")
            .setPriority(NotificationManager.IMPORTANCE_MIN)
            .setCategory(Notification.CATEGORY_SERVICE)
            .build();
    startForeground(2, notification);
}

и запустить сервис с кодом ниже:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForegroundService(new Intent(this,DeviceLocationService.class));
    } else
        startService(new Intent(this,DeviceLocationService.class));
...