Android запуск фоновых процессов, Worker

212
23 августа 2021, 12:20

У меня такой вопрос, в приложении нужно реализовать работу фоновых процессов по периодическому определению координат пользователей.

Для этого решил использовать Worker

Задачи запускаются следующим образом

public boolean onCreate() {
    PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(GeomobyWorker.class, 15, TimeUnit.MINUTES)
            .build();
    WorkManager.getInstance().enqueue(myWorkRequest);
    return true;
}

Т.е. периодически, раз в 15 минут.

В самом Worker

    public Result doWork() {
// тут некоторая логика
// потом вызываю BroadcastReceiver
IntentFilter filter = new IntentFilter();
        filter.addAction(GeoGPSManager.NEW_INIT_LOCATION);
        filter.addAction(GeoGPSManager.NEW_CURRENT_LOCATION);
        filter.addAction(GeoBeaconManager.NEW_BEACON_UPDATE);
        filter.addAction(NEW_INSTANCE_ID);
        filter.addAction(UPDATE_FENCES);
        mCtx.registerReceiver(geoServiceReceiver, filter);
        mCtx.sendBroadcast(intent);
        LocalBroadcastManager.getInstance(mCtx.getApplicationContext()).sendBroadcast(intent);
        return Result.success();    
}

В принципе все работает, вот только мне нужно чтобы процесс запускался после перегрузки, но в Android 8 я получаю следующую ошибку:

2019-10-03 11:28:02.108 1301-1488/? W/PackageManager: Unknown permission android.permission.ACCESS_BACKGROUND_LOCATION in package com.geomoby.demoapp 2019-10-03 11:28:02.108 1301-1488/? W/PackageManager: Not granting permission android.permission.READ_EXTERNAL_STORAGE to package com.geomoby.demoapp because it was previously installed without 2019-10-03 11:28:02.108 1301-1488/? W/PackageManager: Not granting permission android.permission.READ_PHONE_STATE to package com.geomoby.demoapp because it was previously installed without 2019-10-03 11:28:02.108 1301-1488/? W/PackageManager: Unknown permission android.permission.FOREGROUND_SERVICE in package com.geomoby.demoapp 2019-10-03 11:28:02.108 1301-1488/? W/PackageManager: Not granting permission android.permission.ACCESS_COARSE_LOCATION to package com.geomoby.demoapp because it was previously installed without

В Android 9 менее информативный лог

Background execution not allowed receiving intent BOOT_COMPLETED

В файле манифеста

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.PERMISSION_GRANTED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.COARSE_LOCATION"/>
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FINE_LOCATION"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

В чем может быть проблема?

Заранее спасибо!

Answer 1

В Андроид Q ввели еще один перемешен на получение локации в бэкграунде. Добавьте в манифест

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Проверка есть ли у Вас уже такой пермишен (из фрагмента)

fun isBackgroundLocationPermissionGranted(): Boolean {
     if(Build.VERSION.SDK_INT != Build.VERSION_CODES.Q) return true
    activity?.let {
        return ActivityCompat.checkSelfPermission(it, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED
    } ?: return false
}

запрос пермишена

fun requestsBackgroundLocationPermissionDialog() {
    requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), REQUEST_BACKGROUND_LOCATION_PERMISSIONS)
}

ответ запроса вернется в

fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    presenter.checkPermissionsResult(requestCode, permissions, grantResults)
}
READ ALSO
Присоединение ОДНОГО поля из другой Entity

Присоединение ОДНОГО поля из другой Entity

Я реализую RESTFul сервис, позволяющий возвращать информацию о пользователяхУ меня есть два Entity, которые цепляются из БД

134
Как переделать программу, чтобы она могла работать с несколькими запросами?

Как переделать программу, чтобы она могла работать с несколькими запросами?

Есть программа, которой подается на вход 2 натуральных числа: размеры таблицы (а*b) и строка вида ADD (число) (число)Оба числа являются координатами...

88
Ошибки в пути к картинке, как исправить

Ошибки в пути к картинке, как исправить

У меня есть отдельный файл с картинками под названием src, в котором файл img и там картинкиФайл Src я назначил права Resources Root

287
Класс обёртка Integer

Класс обёртка Integer

Почему во всех примерах, я вижу вот такое: Integer a = new Integer(242); - хотя этот вариант деприкейтед, в идее прям зачеркивает этот кодПочему никто не показывает...

168