У меня есть приложение для Android с сервисом переднего плана, который слушает обновления местоположения GPS, я использую LocationManager только с провайдером GPS.
У меня есть этот кусок кода:
Intent intent = new Intent(this, LocationUpdateReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, this.INTERVAL, 0.0f, pi);
Я получаю обновления местоположения через приемник. Он работает правильно, когда экран включен, но когда я выключаю экран устройства, он перестает получать обновления местоположения. Он работает на моем устройстве Redmi 5 и работает, как ожидалось. но моя проблема возникает на huawei.
Примечание: this.INTERVAL = 10000; Я использую wakeLock для предотвращения сна устройства следующим образом:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG:");
wakeLock.aquire();
Также мой сервис в Manifist.xml, как это
<service android:name="com.arttech.services.LocationService" android:enabled="true" />
И наконец, я показываю уведомление для моей службы переднего плана следующим образом:
Notification.Builder ongoing = new Notification.Builder(getBaseContext()).setSmallIcon(R.drawable.logo).setContentTitle("Location Service").setOngoing(true);
if (Build.VERSION.SDK_INT >= 26) {
ongoing.setChannelId("myChannelID");
}
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATIONID, ongoing.build());
Кто-нибудь может помочь мне с этим вопросом? Я бьюсь больше месяца и никуда не денусь.
Спасибо
Обновить:
Я также попытался добавить свое приложение как защищенное приложение вручную через настройки батареи, но у меня такое же поведение. Я протестировал какое-то приложение под названием пережить, и оно отлично записывает местоположения GPS. Что я делаю неправильно?
ОБНОВЛЕНИЕ: Вот мой код OnStartCommand:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("omar","Service Started");
LocationObserver.getInstance().addObserver(this);
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT > 8)
{
Log.d("omar_build",SDK_INT+"");
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
CreateConnectionInstance(); // Connect to socket
startTracking();
isLocationServiceRunning = true;
return START_STICKY;
}
Может быть, это поможет вам, от commonsware
https://commonsware.com/blog/2015/11/18/another-doze-edge-case-foreground.html
Предполагается, что сервис переднего плана с частичным WakeLock блокирует режим Doze, предположительно, с прицелом на музыкальные проигрыватели и тому подобное. Однако г-н Налевка обнаружил, что если процесс с сервисом переднего плана также имеет активность на переднем плане, режим Doze снова вступает во владение.
Дайан Хэкборн рекомендует обходной путь - разделить обслуживание переднего плана на отдельный процесс. Поскольку, похоже, нет способа связать определенные комментарии G+, вам нужно прокрутить список комментариев в этом сообщении, чтобы перейти к их обмену.
Вероятно, это связано с ограничениями, применяемыми заказными брендами, такими как Huawei и некоторыми другими. Вы должны добавить свое приложение в белый список телефона. Пожалуйста, проверьте следующую ссылку Как приложение WhiteList в режиме Doze Android 6.0
ОБНОВЛЕНИЕ: внесите эти два изменения и затем проверьте
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager != null)
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
if (mWakeLock != null)
mWakeLock.acquire(TimeUnit.HOURS.toMillis(10));