微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在启动某些活动之前,小部件无法在 Android 11 上的设备启动时启动服务

如何解决在启动某些活动之前,小部件无法在 Android 11 上的设备启动时启动服务

val startServiceIntent = TestService.getServiceIntent(context).let {
    PendingIntent.getService(context,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 上是否有任何方法可以检查我们是否可以从后台/小部件启动前台服务、相机等?如何确定用户在设备的当前会话中至少启动了一次应用的 Activity?

解决方法

深入Android OS的源代码后,我发现了以下方法来检查相机是否被限制:

@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
}
,

基于@CommonsWare 评论,我需要使用 PendingIntent.getForegroundService() 而不是 PendingIntent.getService()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。