我正在尝试开发全屏模式应用程序。现在,我将我的应用设置为沉浸式模式,每次状态栏和导航栏都隐藏,并且仅当用户在屏幕顶部/底部边缘滑动手势时才会显示
我认为不可能永久禁用状态栏和导航栏,但是如果我以沉浸式模式隐藏并禁用导航栏的所有三个按钮(“主页”按钮,“后退”按钮和“任务管理器”按钮),这将是一个很好的解决方案他们正在显示
注意::我仅针对Android P开发此应用,并且仅需要此版本的解决方案。
要将应用设置为沉浸式模式,我已将其添加到 AndroidManifest.xml
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
在我的 MainActivity.kt 中:
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_INMERSIVE_STICKY)
我一直在尝试访问UI侦听器以避免出现手势,但失败了
window.decorView.setOnSystemUiVisibilityChangeListener {
//For example hide action
actionBar.hide()
}
我不知道如何访问导航栏按钮并禁用其操作,我也想避免从顶部边缘滑动并显示通知管理器视图。
请一些帮助和建议? 预先感谢!
UPDATE 09/18/19
为此,我在应用程序中实现了信息亭模式。
我进行了启动器活动,该活动配置了应用程序所需的所有内容,如果一切正常,则应用程序可以正常运行,但如果运行不正常,则会显示一条消息警告。
有两个非常重要的前提条件:
1。。设备中不应有任何帐户(Google帐户,Samsung帐户等)
2。。应用应为设备的所有者和管理员(我将在后面说明)
STEPS
1。在AndroidManifest中实现接收器
<receiver
android:name=".security.CustomDeviceAdminReceiver"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_receiver" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
</intent-filter>
</receiver>
2。实施CustomDeviceAdminReceiver
class CustomDeviceAdminReceiver: DeviceAdminReceiver() {
companion object {
fun getComponentName(context: Context): ComponentName {
return ComponentName(context.applicationContext, CustomDeviceAdminReceiver::class.java)
}
}
}
3。创建一个xml文件夹,并在其中创建一个名为device_admin_receiver的xml文件
<?xml version="1.0" encoding="utf-8"?>
<device-admin>
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
</uses-policies>
</device-admin>
4。在启动器活动中执行以下操作:
class LauncherActivity : BaseActivity() {
private var adminComponentName: ComponentName
private var devicePolicyManager: DevicePolicyManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.launcher_activity)
adminComponentName = CustomDeviceAdminReceiver.getComponentName(this)
devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
}
override fun onResume() {
super.onResume()
initKioskMode()
}
private fun initKioskMode() {
setUserRestriction(UserManager.DISALLOW_SAFE_BOOT)
setUserRestriction(UserManager.DISALLOW_FACTORY_RESET)
setUserRestriction(UserManager.DISALLOW_ADD_USER)
setUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA)
setKeyGuardEnabled()
}
private fun setUserRestriction(restriction: String) = devicePolicyManager.addUserRestriction(adminComponentName, restriction)
private fun setKeyGuardEnabled() {
devicePolicyManager.setKeyguardDisabled(adminComponentName, false)
setLockTask()
}
private fun setLockTask() {
devicePolicyManager.setLockTaskPackages(adminComponentName, arrayOf(packageName))
startLockTask()
startActivity(Intent(this, MainActivity::class.java))
}
private fun checkAppDeviceOwnerStatus() {
if (isAppDeviceOwner() && isAppDeviceActiveAdmin()) initKioskMode()
else {
stopLockTask()
showWarningAdvices()
}
}
private fun isAppDeviceOwner() = devicePolicyManager.isDeviceOwnerApp(packageName)
private fun isAppDeviceActiveAdmin() = devicePolicyManager.isAdminActive(adminComponentName)
private fun showWarningAdvices() {
adminWarningTitle.visibility = View.VISIBLE
adminWarningMessage.visibility = View.VISIBLE
}
}
5。将我的活动设置为主要和启动器
<activity
android:name=".screen.main.LauncherActivity"
android:screenOrientation="portrait">
<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>
6。最后,您必须将应用设置为设备所有者和管理设备应用
这是使用->
通过命令行完成的adb shell dpm set-device-owner packageName/path to Admin device file
PD:要从设备中删除所有者配置文件以使其必须在终端中运行:
adb shell dpm remove-active-admin packageName/path to Admin device file
Aaaaa,仅此而已!