我正在尝试在无法关闭的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)
}
}
第一个打开无法关闭的视图的视图:
不允许轻易关闭应用的第二个视图:
从屏幕边缘滑动后的第二个视图:
已解决:使用了旋转屏幕/信息亭/ Cosu模式。我还有 允许NFC的问题,但找到了解决方法。 How can I send a string through NFC while Screen-Pinning?
答案 0 :(得分:0)
您可能想看看
https://developer.android.com/work/cosu
这使您可以将单个应用程序锁定到屏幕上,并隐藏“主页”和“最近使用”按钮,以防止用户逃离该应用程序。
请注意,只有在拥有设备的情况下,这才可能实现,您不能使用目标受众的手机来做到这一点。
这类东西主要用于单一目的,例如数字标牌,票证打印,销售点或库存管理。