Местоположение обновляется, когда экран и Wi-Fi отключены на Android Oreo - PullRequest
0 голосов
/ 18 марта 2019

Я пишу приложение для отслеживания местоположения пользователя. Я запускаю свое приложение на планшете Huawei MediaPad T5 с Android Oreo. Я читал об обновлениях местоположения в фоновом режиме на Android 8. Итак, я использую сервис переднего плана. Мое приложение работает очень хорошо, когда у меня включен Wi-Fi. Если я выключаю Wi-Fi, приложение не получает местоположения при выключенном экране. Я включил сканирование Wi-Fi.

Запускаю службу переднего плана в MainActivity

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

В TrackerService у меня есть метод onCreate, который создает и показывает уведомление переднего плана.

@Override
public void onCreate() {
    super.onCreate();

    Context context = getAplicationContext();
    String contentText = "App works with location";
    Notification notification;
    Intent intent = new Intent(context, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    NotificationManager notificationManager;
    String CHANNEL_ID = "my_channel_01";
    CharSequence name = context.getString(R.string.channel_name);
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
    notification = new NotificationCompat.Builder(context, CHANNEL_ID)
                    .setContentTitle("Base")
                    .setContentText(contentText)
                    .setSmallIcon(R.drawable.icon)
                    .setContentIntent(pendingIntent)
                    .setOngoing(true)
                    .build();
    notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
    if (notificationManager != null) {
         notificationManager.createNotificationChannel(channel);
         notificationManager.notify(1, notification);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForeground(1, notification);
    } 
}

В onStartCommand я инициирую запрос местоположения, обратный вызов и запрос обновлений.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    locationRequest = LocationRequest.create();
    locationRequest.setInterval(1000 * 50);
    locationRequest.setFastestInterval(1000 * 30);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationCallback locationCallback = new LocationCallback() {

        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                Log.i("LOCATION_TAG", location.getProvider() + " " + location.getAccuracy() + " " + getFormattedDate(location.getTime()));
            }
        }
    };

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return -1;
        }
    }
    FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);

    return START_REDELIVER_INTENT;
}

Я также пытался использовать WakeLock в onCreate, но это не решило мою проблему.

PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "LOCATION + ":" + "WAKE LOCK");
wakeLock.acquire();

Как решить эту проблему?

...