Обновление GPS-местоположения перестает обновляться, если положить приложение в фоновом режиме и отключить экран на huawei mya-L22 - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть приложение 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;
}

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Может быть, это поможет вам, от commonsware

https://commonsware.com/blog/2015/11/18/another-doze-edge-case-foreground.html

Предполагаемый сервис с частичным WakeLock должен блокировать режим Doze, предположительно с прицелом на музыкальные проигрыватели иподобное, аналогичное, похожее.Однако г-н Налевка обнаружил , что, если процесс с сервисом переднего плана также имеет активность на переднем плане, режим Doze вступает во владение снова.

Рекомендуемое обходное решение Дайан Хакборн состоит в том, чтобы разделить службу переднего плана наотдельный процесс.Поскольку, кажется, нет способа связать определенные комментарии G +, вам нужно прокрутить вниз список комментариев в этом посте , чтобы перейти к их обмену.

0 голосов
/ 24 декабря 2018

Вероятно, это связано с ограничениями, применяемыми такими пользовательскими брендами, как Huawei и некоторыми другими.Вы должны добавить свое приложение в белый список телефона.Пожалуйста, проверьте следующую ссылку Как сделать приложение WhiteList в режиме Doze для Android 6.0

ОБНОВЛЕНИЕ: внесите эти два изменения, а затем установите флажок

  1. Получить пробуждение в onStartCommand
  2. Приобретите wakelock с приблизительным временем
  3. Освободите ваш wakelock, когда сервис уничтожен или когда работа сервиса завершена

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...