Android Kotlin-永久禁用UI系统按钮

时间:2018-11-23 08:36:02

标签: android kotlin

我正在尝试在无法关闭的Android中创建视图。我的意思是所有UI系统按钮(“主页”,“后退”,“状态栏”等)均被禁用。 关闭应用程序或打开未阻止视图的目标方式是NFC卡。

上周我一直在尝试这样做,但我对此一无所知。 也许你们中的某人会知道该怎么做。 感谢您的帮助。

我可以隐藏导航和状态栏,但是如果我从屏幕边缘滑动,它将再次出现。

我在developer.android.com和(GitHub repo)上找到了大部分工作。

但是我仍然可以关闭应用程序。

游乐场代码:https://github.com/BoguskiAdam/AndroidNoUiButtons

_________________________

编辑:

  

我很少看到这样的应用程序。我想成为   类似于“信息亭”模式不应允许用户   最小化应用程序。他只能使用它,但不能去   第一眼。只有我可以使用NFC卡打开第一张视图。 NFC是   配置为打开第一个视图(用户不可用)   包含配置等,并允许我关闭应用。

_________________________

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.adam.nohome">

    <uses-permission android:name="android.permission.REORDER_TASKS"/>

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:ignore="GoogleAppIndexingWarning">
        <activity
                android:name=".MainActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:label="Test label"
                android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
                android:name=".NoUiActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:label="Test tittle"
                android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

查看XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000"
        tools:context=".NoUiActivity">
</android.support.constraint.ConstraintLayout>

查看代码:

package com.example.adam.nohome

import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.view.*

class NoUiActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        supportActionBar?.setDisplayHomeAsUpEnabled(false)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_no_ui)

        hideUi()
    }

    override fun onPause() {
        val activityManager = applicationContext
            .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

        activityManager.moveTaskToFront(taskId, 0)
        super.onPause()
    }

    private fun hideUi() {
        window.statusBarColor = Color.TRANSPARENT

        setGestureDetector()
        hideSystemUI()
        setUiListener()
    }

    private fun setGestureDetector() {
        val contentView = window.decorView
        contentView.isClickable = true
        val clickDetector = GestureDetector(this,
            object : GestureDetector.SimpleOnGestureListener() {
                override fun onSingleTapUp(e: MotionEvent): Boolean {
                    hideSystemUI()
                    return true
                }
            }
        )
        contentView.setOnTouchListener { _, motionEvent -> clickDetector.onTouchEvent(motionEvent) }
    }

        private fun hideSystemUI() {
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_FULLSCREEN
                        //or View.SYSTEM_UI_FLAG_LOW_PROFILE
                        or View.SYSTEM_UI_FLAG_IMMERSIVE
                )
    }


//    private fun hideSystemUI() {
//        window.decorView.systemUiVisibility = (
//                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
//                        or View.SYSTEM_UI_FLAG_IMMERSIVE
//                )
//    }

    private fun setUiListener() {
        window.decorView.setOnSystemUiVisibilityChangeListener { flags ->
            run {
                supportActionBar?.hide()
                hideSystemUI()
            }
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        //handle the click on the back arrow click

        val result = when (item.itemId) {
            android.R.id.home -> {
                onBackPressed()
                true
            }

            else -> super.onOptionsItemSelected(item)
        }
        return result
    }


    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        hideSystemUI()
    }

    // It recognize here only 'Back' button
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_MOVE_HOME) {
            return true;
        }
        return super.onKeyDown(keyCode, event)
    }
}

第一个打开无法关闭的视图的视图:

First view

不允许轻易关闭应用的第二个视图:

Second view

从屏幕边缘滑动后的第二个视图:

Second view after swipe

  

已解决:使用了旋转屏幕/信息亭/ Cosu模式。我还有   允许NFC的问题,但找到了解决方法。   How can I send a string through NFC while Screen-Pinning?

1 个答案:

答案 0 :(得分:0)

您可能想看看

https://developer.android.com/work/cosu

这使您可以将单个应用程序锁定到屏幕上,并隐藏“主页”和“最近使用”按钮,以防止用户逃离该应用程序。

请注意,只有在拥有设备的情况下,这才可能实现,您不能使用目标受众的手机来做到这一点。

这类东西主要用于单一目的,例如数字标牌,票证打印,销售点或库存管理。