- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个以 Kiosk 模式启动的应用程序,应该读取 NFCTags 并使用react。它正在使用 enableReaderMode
在 NFCAdapter
在 onResume
开始阅读它们。如果应用程序是例如,一切正常。 (重新)在开发过程中开始。但是,如果我重新启动设备(并且 Activity 自动启动), Activity 有时会进入正确模式,但通常只播放 NFC 系统声音和我的 handleTag
不叫。
根据我的记录,我拥有的 NFCAdapter 设置代码在所有情况下都被正确调用
我试过enableForegroundDispatch
也一样,但是效果是一样的。我还尝试定期记忆 enableReaderMode
但它也有同样的效果。
有人知道发生了什么吗?
更新
当我尝试在失败的情况下设置阅读器模式时,我在日志中看到此错误消息
NfcService: setReaderMode: Caller is not in foreground and is not system process.
adb shell dpm set-device-owner ...
<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"
android:testOnly="true">
<!-- snip DeviceAdminReceiver -->
<activity
android:name=".FullscreenActivity"
android:screenOrientation="reverseLandscape"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/FullscreenTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" />
public class FullscreenActivity extends AppCompatActivity {
NfcAdapter mAdapter;
private DevicePolicyManager mDevicePolicyManager;
private ComponentName mAdminComponentName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDevicePolicyManager = (DevicePolicyManager) getSystemService(
Context.DEVICE_POLICY_SERVICE);
if (mDevicePolicyManager.isDeviceOwnerApp(getPackageName())) {
mAdminComponentName = MyDeviceAdminReceiver.getComponentName(this);
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MAIN);
intentFilter.addCategory(Intent.CATEGORY_HOME);
intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
mDevicePolicyManager.addPersistentPreferredActivity(
mAdminComponentName, intentFilter,
new ComponentName(getPackageName(),
FullscreenActivity.class.getName()));
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName,
new String[]{getPackageName()});
mDevicePolicyManager.setKeyguardDisabled(mAdminComponentName, true);
}
startLockTask();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
setFullscreenFlags();
}
}
private void setFullscreenFlags() {
getWindow().getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
@Override
protected void onResume() {
super.onResume();
setFullscreenFlags();
mAdapter = NfcAdapter.getDefaultAdapter(this);
setupNfcAdapter();
}
private void setupNfcAdapter() {
if (mAdapter == null) return;
Bundle options = new Bundle();
// No sure this is needed
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 50000);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
mAdapter.enableReaderMode(this, this::handleTag,
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS |
NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_NFC_B |
NfcAdapter.FLAG_READER_NFC_F |
NfcAdapter.FLAG_READER_NFC_V, options);
}
@Override
protected void onPause() {
super.onPause();
if (mAdapter != null) {
mAdapter.disableReaderMode(this);
}
}
private void handleTag(Tag tag) {
Log.d("NFCADAPTER", "tag detected");
}
最佳答案
我找到了适合我的情况的解决方案(嗯,更多的解决方法)。
我认为发生的是 NfcService
不知道 Activity 正在前台运行。 NfcService
通过 ForegroundUtils
跟踪前台 Activity 它利用 IProcessObserver
.
我认为正在发生的事情是,我的 Activity 有时会在设置此流程观察者之前成为前台 Activity ,因此 NfcService
认为我的 Activity 没有在前台运行,从而阻止了对 read 方法的调用。
作为解决方法,我所做的是接收 NfcAdapter.STATE_ON
通过在 NfcAdapter.ACTION_ADAPTER_STATE_CHANGED
上注册接收器进行更改在 Activity 中。如果收到此事件,则认为是上述情况,我会终止并重新启动应用程序(请参阅 [1])。 ForgroundUtils
现在观察到了这一点。我能够进入阅读器模式。
[1] How do I programmatically "restart" an Android app?
关于android - 如果在 Kiosk 模式 Activity 中启动,NFCAdpater.enableReaderMode(...) 无法始终如一地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61142449/
我正在使用 PHP、HTML5 和 Javascript 开发 KIOSK 系统。我想在一台 PC 上连接多个(触摸屏)显示器。我希望这些监视器以全屏模式显示浏览器,用户只能访问我的网站而无需任何其他
我正在寻找一种在 Android 上退出 kioskmode 应用程序的解决方案。 Out 应用程序在 Kiosk 模式下运行,以防止通过按返回或主页按钮意外关闭,但我们需要根据请求关闭它。有人对此有
我目前正在 root Android 设备(来自 Ugoos 的 MK809III)上开发信息亭应用程序。 我的目标是用 WebView 开始一个 Activity 加载特定 URL 的全屏模式。 但
我希望在我的 Developer iPad 上设置一个一次性应用程序,以防止使用主页按钮(最好还有锁定按钮)。我想密码保护基本上离开应用程序。最好的方法是什么? 最佳答案 在这里查看我的答案 Lock
我的团队的任务是将用于播放媒体文件的全屏、信息亭式应用程序从 Windows 迁移到嵌入式 ARM Linux(瘦客户端)。我们需要在 sd/1080p 中支持 mpeg-2 播放以及 HTML、SW
Windows有一个展台(Kiosk)模式。展台模式可以使Windows作为数字标牌进行使用。具体请参考Windows 展台 配置完展台模式,重启设备后,Windows会以全屏的方式运行展
我需要在登录后启动我制作的应用程序,然后再加载其他任何内容。我通过浏览找到了如何做到这一点,并且我的应用程序只是按我的意愿启动,但是当我需要使用键盘输入内容时,什么也没有发生,我该怎么办? 这是一个Q
我正在制作一个需要用户全神贯注直到实现指定目标的应用程序。在实现目标之前,如果用户尝试按“home”按钮,则应将其禁用,或者像 ios6 中的“kiosk 模式”一样。我只需要在启动应用程序时以编程方
有没有一种方法可以将树莓派设置为一种“信息亭”模式,在登录后只有一个java程序的GUI会自动启动? 最佳答案 您需要首先按照第一个答案中的说明为 pi 用户设置自动登录。 如果您使用默认 LXDE
在自助服务终端环境中,没有键盘,只有浏览器将其视为 2 键鼠标的设备,我需要使用鼠标右键单击。这是一个在浏览器中针对 file://.... 运行的自定义应用程序,在机场安检后无法访问互联网。 左键会
我必须为信息亭开发一个 html/js 应用程序。该信息亭将显示在 Windows 触摸屏上,具有“Windows Touch”功能。 似乎有一些框架可以在移动平台上使用手势,但我没有找到用于带有触摸
我有一个简单的 shell 脚本,可以在某个 url 上以 kiosk 模式启动 chromium。它工作正常,但在信息亭模式下,Chrome 设置中的缩放级别似乎会被忽略。 我通常可以使用 ctrl
Internet 上的某些安全网站(例如银行等)已禁用“右键单击”。我知道这只是为了防止最终用户访问“检查元素”或“工具箱”元素。但是,在某些浏览器上,只需按 F12 键或任何等效键就可以完成这项工作
我正在使用扩展程序运行 google chrome(版本 57)kiosk 模式: --kiosk-printing 自从更新后,我注意到从作业发送到打印机到实际打印有 1-2 分钟的延迟 我使用的是
我正在为 kiosk 模式编写 Android 应用程序。我正在使用本教程创建信息亭模式:http://www.andreas-schrade.de/2015/02/16/android-tutori
我有一个信息亭应用程序,必须始终禁用任务管理器以防止用户关闭程序。 但有些用户需要TaskManager来关闭挂起的程序。 任何帮助都会被挪用。 但是,我确信 Windows 中有一个功能可以防止关闭
我在 heroku 上有一个小的 Node 应用程序。它嵌入在 Chrome kiosk app 中. 我希望该应用只能在以自助服务终端模式安装它的 Chromebook 上访问。 我尝试过 HTTP
新 ElectronJS 窗口的 BrowserWindow 配置中的 kiosk: true 究竟做了什么? documentation只是说明参数指示窗口处于“信息亭”模式。我找不到有关这意味着什
我有一个相当基本的 React Native 应用程序。我想根据正在呈现的组件有条件地锁定/解锁应用程序。例如,如果 Player,我想锁定应用程序(在 kiosk 模式下)组件被渲染,然后解锁应用程
我们正在开发一个面向客户的 Electron 应用程序,该应用程序应以自助服务终端模式运行。该应用程序在装有 Windows 10 的触控设备上运行。 即使应用程序处于自助服务终端模式,用户也可以通过
我是一名优秀的程序员,十分优秀!