Я пишу приложение для отслеживания местоположения пользователя. Я запускаю свое приложение на планшете 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();
Как решить эту проблему?