java - 关闭 qs 磁贴、音量面板和导航等 android 功能
问题描述
我正在开发一个健康应用程序,它可以让你的手机在给定的一段时间内(例如 30 分钟、1 小时、1.5 小时)关闭
在这种状态下,用户只能看到一个有剩余时间的屏幕,而不能
- 访问 QS 瓷砖
- 访问音量面板
- 退出活动
类似于 Oneplus Zen 模式的东西
我为这样做而想到的事情
杀死 SystemUI 进程。(这样做很可能会处理 QS 和音量面板,可能需要 root 用户?SystemUI 也会自动重启,非常顽固)
使应用程序成为动态启动器?(从技术上讲,您无法离开启动器并在重新启动时返回它)
我怎样才能解决这个问题?有任何想法吗?
解决方案
使应用程序成为手机的默认启动器是您想要实现的更实用的解决方案。我之前在 Flutter 应用程序中完成了此操作,该应用程序将安装在 kiosk 设备上以获取客户的订单,并且运行良好。让它工作有点棘手,还有很多事情要做。这是我当时做的事情的清单:
使用
FLAG_SHOW_WHEN_LOCKED
窗口标志绕过锁定屏幕。在里面
onResume
添加FLAG_FULLSCREEN
标志来隐藏状态栏。通过将类别添加到 in 来制作您的
MainActivity
启动器。您还可以添加我使用的其他属性(如果您不知道它们应该做什么,请搜索它们)。LAUNCHER
AndroidManifest.xml
<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:excludeFromRecents="true" android:hardwareAccelerated="true" android:launchMode="singleInstance" android:showOnLockScreen="true" android:showWhenLocked="true" android:theme="@style/LaunchTheme" android:turnScreenOn="true" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
监听你的窗口焦点变化,
MainActivity
如果它失去焦点,把你的应用程序放在前面。private fun moveToFront() { val closeDialog = Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS) sendBroadcast(closeDialog) (activity.applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager) .moveTaskToFront(activity.taskId, ActivityManager.MOVE_TASK_WITH_HOME) window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (!hasFocus) { moveToFront() } }
我还在检查我的应用程序是否是默认启动器。
private fun isAppDefault(): Boolean { val intent = Intent(Intent.ACTION_MAIN) intent.addCategory(Intent.CATEGORY_HOME) val res: ResolveInfo = packageManager.resolveActivity(intent, 0) return res.activityInfo != null && (packageName == res.activityInfo.packageName) }
您需要在 Flutter 和平台之间进行通信,
MethodChannel
以启用和禁用强制模式并获取应用程序的状态。
推荐阅读
- javascript - 如果在手机上使用 CSS 将桌面菜单更改为另一种样式
- c# - 自定义 JsonConverter 永远不会被 MVC 模型绑定器/控制器调用
- python - 优化滚动窗口熊猫数据框
- oracle - 基于字符串查找字段然后提取子字符串值
- grafana - Grafana Loki LogQL 条形量规按总顺序排列
- curl - 仅使用 CURL 命令在 Postman 中上传文件
- python - 从 txt 文件中获取输入并放入 Dictionary
- python - 如何从 Python 中的文本中提取 2d 年?
- ios - 在从 FCM API 发送推送通知时,对 iOS 设备做出反应本机面临的“错误”:“NotRegistered”
- knitr - knitr 表中的 column_spec 函数