如何禁用导航栏和状态栏的按钮?

时间:2019-09-05 08:05:46

标签: android statusbar navigationbar android-homebutton

我正在尝试开发全屏模式应用程序。现在,我将我的应用设置为沉浸式模式,每次状态栏和导航栏都隐藏,并且仅当用户在屏幕顶部/底部边缘滑动手势时才会显示

我认为不可能永久禁用状态栏和导航栏,但是如果我以沉浸式模式隐藏并禁用导航栏的所有三个按钮(“主页”按钮,“后退”按钮和“任务管理器”按钮),这将是一个很好的解决方案他们正在显示

注意::我仅针对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,仅此而已!

0 个答案:

没有答案