我正在评估是否以及如何移植CF .NET企业应用程序以在Android设备上运行。 Windows Mobile手机上的应用程序以kiosk模式运行,其中应用程序在启动后以全屏模式自动启动,并且用户无法意外或自愿访问手机的任何其他部分。
Android上是否可以在启动后只有一个应用程序自动启动,并防止用户意外(或自愿)访问Android设备的任何其他部分?
答案 0 :(得分:26)
您可以通过收听BroadcastReceiver中的android.intent.action.BOOT_COMPLETED
意图并从那里启动您的活动,在启动时自动启动应用程序。在活动中,您可以将自己注册为新的默认主屏幕[1]并处理密钥。
我认为有些情况下如果不修改框架就无法处理(例如Home上的longpress显示当前活动的应用程序) - 但我也可能会误会。
但对于一个足够的原型。
玩得开心!
[1]:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
答案 1 :(得分:17)
您可以自定义此功能(禁用对菜单的访问,限制应用程序添加等)以启用自助服务终端。 http://code.google.com/p/android-launcher-plus/
答案 2 :(得分:17)
在新的Android L预览版中,Google宣布了Task Locking,就是这样做的。但它似乎确实需要root。
L Developer Preview引入了一个新的任务锁定API 您暂时限制用户离开您的应用或存在 被通知中断。例如,如果您可以使用此功能 正在开发一个教育应用程序,以支持高风险评估 Android上的要求。一旦您的应用激活此模式,用户就会 无法看到通知,访问其他应用或返回 主屏幕,直到您的应用退出模式。
为防止未经授权的使用,只有授权的应用才能激活任务 锁定。此外,必须由a授予任务锁定授权 特别配置的设备所有者应用程序,通过
android.app.admin.DevicePolicyManager.setLockTaskComponents()
方法。要设置设备所有者,请按以下步骤操作:
- 将运行Android
userdebug
版本的设备附加到您的开发中 机。- 安装您的设备所有者应用。
- 创建
device_owner.xml
文件 并将其保存到设备上的/data/system
目录中。
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot
在您的应用中使用任务锁定API之前,请验证您的 通过呼叫授权活动 DevicePolicyManager.isLockTaskPermitted()。
要激活任务锁定,请致电
android.app.Activity.startLockTask()
来自您的授权活动。当任务锁定处于活动状态时,以下行为将生效:
- 状态栏为空白,以及用户通知和状态信息 是隐藏的。
- 隐藏了主页和最近的应用程序按钮。
- 其他应用可能会 不开展新活动。
- 当前的应用可能会开始新的活动, 只要这样做不会创建新任务。
- 用户保持锁定状态 在您的应用上,直到授权活动呼叫
Activity.stopLockTask()
。
答案 3 :(得分:9)
在搜索了一段时间后,我想出了一个很好的解决方案。这只适用于root设备,但我想如果只是这个应用程序,那么生根应该不是问题。
通过添加
使您的应用成为启动器<category android:name="android.intent.category.HOME" />
到你的意图过滤器
确保您的应用折叠工具栏,以便无法访问通知栏,请参阅How to disable status bar / notification bar on android programmatically?或http://blog.vogella.com/2011/02/28/android-hidding-the-status-and-title-bar/
然后,为了阻止任何其他程序被错误地打开,请使用辅助功能服务检查Window State Changed,将软件包与白名单或黑名单进行比较,如果不运行则使用ActivityManager.killBackgroundProcesses进行终止。
另请查看http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/
答案 4 :(得分:3)
Set up Single-Purpose Devices Page描述了这些事情,你可以从那里轻松了解更多信息。
现在很容易将 Android 6.0 Marshmallow和更高版本的设备配置为公司拥有的一次性(COSU)设备。
答案 5 :(得分:3)
Google最近发布了Android Management API,可以为运行Android 5.1或更高版本的任何Android设备轻松设置信息亭模式,还可以设置其他各种政策。
答案 6 :(得分:2)
在此forum post中找到了另一种可能的技巧。引用该帖子:
使用以下方法可以构建一个应用程序 防止“常规”用户玩你的其他任何东西 应用
该应用程序由两个模块组成。主要活动和一个 服务。该服务配置为在引导时启动。什么时候服务 启动它会检查活动是否正在运行。如果不是 运行它使用计时器来启动主要活动。
当活动暂停时,它会安排服务以一个开始 第二:代码:
Sub Activity_Pause (UserClosed As Boolean)
If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)
End Sub
如果用户按下主屏幕,则会出现主屏幕 几秒钟。但是,您的应用程序将返回到前端 几秒钟后,用户将无法与任何人进行交互 其他应用程序或更改设置。
该服务被设置为前台服务。这可以防止Android 从杀死我们的服务。按“停止”按钮可停用自助服务终端 模式。
似乎也有example kiosk-mode code ZIP file available for download。
答案 7 :(得分:2)
实现此目的的最佳方法是将您的应用设置为启动器
<activity ...
android:launchMode="singleInstance"
android:windowActionBar="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
最可靠的方法是使用Lollipop或更高版本的设备并使用
startLockTask
首先,您必须将应用设置为设备所有者。注意,您的设备必须取消设置:如果您已注册,则应重置出厂设置并跳过帐户注册。
为了能够注册您的应用,您必须首先设置DeviceAdminReceiver组件:
package com.example.myapp;
public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
return "are you sure?";
}
@Override
public void onDisabled(Context context, Intent intent) {
Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
}
@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
// here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
}
}
一旦你有一个未设置的设备,你可以从adb启动以下命令(不需要root )
adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
要避免安卓系统要求用户授权您必须致电您的应用 setLockTaskPackages
最后!
@Override
public void onResume(){
super.onResume();
DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
Context.DEVICE_POLICY_SERVICE);
ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
startLockTask();
}
@Override
public void finish(){
stopLockTask();
super.finish();
}
答案 8 :(得分:1)
Xposed框架可以做到这一点。它需要root,并且它有可能无法在所有平台上运行。在类 android.app.StatusBarManager 中查找 disable()方法。
在这里看看如何编写自己的模块: Xposed development tutorial
乍一看,这比你想象的容易得多。祝你好运!答案 9 :(得分:0)
除了使用BOOT接收器设置应用程序,以及this answer以防止状态栏扩展外,此解决方案适用于4.4及更高版本作为完整的自助服务终端应用程序:
放入你的onCreate():
final View view = (View) findViewById(android.R.id.content);
if (view != null) {
//"hides" back, home and return button on screen.
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
view.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_FULLSCREEN);
}
}
});
}
这将完全隐藏后退按钮,应用程序和主页按钮。
答案 10 :(得分:0)
信息亭模式只不过是在您打开Android设备时锁定单个或一组应用程序。这可以通过锁定任务模式来实现。当设备在锁定任务模式下运行时,用户通常看不到通知,访问未列入白名单的应用程序或返回主屏幕。
设备策略控制器(DPC)可以将系统处于锁定任务模式时可以运行的应用列入白名单。由于它是用于特定目的的专用设备,因此使用该设备的人无法退出锁定任务模式。 Android 5.0及更高版本的设备可以在锁定任务模式下运行。
• Whitelisting the applications
第一步是通过DPC将应用程序列入白名单。 DPC可以通过调用将可在锁定任务模式下使用的应用列入白名单
DevicePolicyManager.setLockTaskPackages()
▪ Start lock task mode
白名单一旦完成,DPC可以调用以下函数来启动锁定任务。
ActivityOptions.setLockTaskEnabled()
您可以在此处找到有关锁定任务模式的更多详细信息。 https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode