Android Kotlin - отключение системных кнопок интерфейса пользователя навсегда - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать представление в Android, которое нельзя закрыть.Я имею в виду, что все системные кнопки интерфейса пользователя (Домой, назад, строка состояния и т. Д.) Отключены.Назначение способа закрыть приложение или открыть не заблокированный вид - NFC-карта.

Я пытался сделать это на прошлой неделе, и у меня больше нет идей.Может быть, кто-то из вас знает, как это сделать.Спасибо за любую помощь.

Я могу скрыть навигацию и строку состояния, но если я проведу пальцем по краю экрана, он снова появится.

Большинство рабочих вещей, которые я нашел на developer.android.com и в ( GitHub репо ).

Но я все еще могу закрыть приложение.

Код игровой площадки: 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, но я нашел обходной путь. Как я могу отправить строку через NFC при закреплении экрана?

1 Ответ

0 голосов
/ 28 ноября 2018

Возможно, вы захотите взглянуть на

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

Это позволяет заблокировать одно приложение на экране и скрыть кнопки «Домой» и «Последние», чтобы предотвратитьпользователи не могут выйти из приложения.

Помните, что это возможно только в том случае, если у вас есть устройство, вы НЕ МОЖЕТЕ делать это с телефоном от целевой аудитории.

Этот тип вещей в основном используетсяиспользуется для единственной цели, такой как цифровое обозначение, печать билета, пункт продажи или управление запасами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...