Я пытаюсь создать представление в 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)
}
}
Первый вид, который открывает представление, которое нельзя закрыть:
Второй вид, который не должен позволять легко закрывать приложение:
Второй вид послепроведите пальцем по краю экрана:
решено : используется режим вращающегося экрана / киоска / Cosu.У меня была дополнительная проблема с разрешением NFC, но я нашел обходной путь. Как я могу отправить строку через NFC при закреплении экрана?