Виджет не может запустить службу при загрузке устройства на Android 11, пока не будет запущена какая-либо активность

val startServiceIntent = TestService.getServiceIntent(context).let {
    PendingIntent.getService(context, 0, it, PendingIntent.FLAG_UPDATE_CURRENT)
}
val views = RemoteViews(context.packageName, R.layout.layout_app_widget).apply {
    setOnClickPendingIntent(R.id.start_service_btn, startServiceIntent) // doesn't work on boot device
    setOnClickPendingIntent(R.id.start_activity_btn, startActivityIntent) // works fine
}
appWidgetManager.updateAppWidget(appWidgetId, views)

Как относиться к такому поведению? Как я могу хотя бы показать пользователю сообщение о том, что служба не может быть запущена из виджета, пока он не запустит приложение (сделает его видимым) или вместо этого запустит действие во время этого сеанса устройства?

Потому что теперь ничего не происходит, когда я нажимаю кнопку запуска службы, пока я не запущу приложение хотя бы один раз.

Есть ли способ на Android 11 проверить, можем ли мы запустить службу переднего плана, камеру и т. Д. Из фона / виджета? Как узнать, что пользователь запустил активность приложения хотя бы один раз за текущую сессию устройства?


person user924    schedule 17.05.2021    source источник
comment
Вы пробовали PendingIntent.getForegroundService()?   -  person CommonsWare    schedule 18.05.2021
comment
@CommonsWare спасибо, это работает. И здорово, что из виджета мы можем начать использовать камеру и микрофон на Android 11 в службе переднего плана без запуска приложения (активности) после загрузки устройства.   -  person user924    schedule 19.05.2021


Ответы (2)


Погрузившись в исходный код ОС Android, я нашел следующий способ проверить, ограничена ли камера:

@RequiresApi(Build.VERSION_CODES.Q)
internal fun AppOpsManager.isCameraAllowedForPackage(packageName: String): Boolean {
    val res = unsafeCheckOpNoThrow(
        AppOpsManager.OPSTR_CAMERA,
        android.os.Process.myUid(),
        packageName
    )
    return res == AppOpsManager.MODE_ALLOWED
}
person Balazs Banyai    schedule 18.05.2021
comment
Спасибо. мне тоже понадобится. - person user924; 20.05.2021

Основываясь на комментарии @CommonsWare, мне нужно использовать PendingIntent.getForegroundService() вместо PendingIntent.getService()

person user924    schedule 20.05.2021