Android中的Kiosk模式
我正在评估是否以及如何将CF.NET企业应用程序移植到Android设备上运行。Windows Mobile phones上的应用程序在kiosk模式下运行,在该模式下,应用程序在启动后以全屏模式自动启动,用户无法意外或自愿访问手机的任何其他部分Android中的Kiosk模式,android,kiosk,kiosk-mode,Android,Kiosk,Kiosk Mode,我正在评估是否以及如何将CF.NET企业应用程序移植到Android设备上运行。Windows Mobile phones上的应用程序在kiosk模式下运行,在该模式下,应用程序在启动后以全屏模式自动启动,用户无法意外或自愿访问手机的任何其他部分 在Android上,启动后是否可以只有一个应用程序自动启动,并防止用户意外(或自愿)启动访问Android设备的任何其他部分?您可以通过在BroadcastReceiver中收听Android.intent.action.boot\u完成intent,
在Android上,启动后是否可以只有一个应用程序自动启动,并防止用户意外(或自愿)启动访问Android设备的任何其他部分?您可以通过在BroadcastReceiver中收听
Android.intent.action.boot\u完成intent,在启动时自动启动应用程序,并从那里开始您的活动。在活动中,您可以将自己注册为新的默认主屏幕[1],并处理按键
我认为有些情况如果不修改框架就无法处理(比如Home上的longpress显示当前活动的应用程序)——但我也可能弄错了
但对于一个原型来说,这就足够了
享受修补的乐趣
[1] :
在这方面找到了另一种可能的技术。引用该帖子:
使用以下方法,您可以构建一个将
防止“普通”用户玩除您的
应用程序
该应用程序由两个模块组成。主要活动和
服务服务配置为在引导时启动。服务何时开始
它检查活动是否正在运行。如果不是
运行它使用计时器来启动主活动
当活动暂停时,它会安排服务在一个小时内启动
第二:代码:
如果用户按下主屏幕,主屏幕将出现
几秒钟。但是,您的应用程序将返回到前端
几秒钟后,用户将无法与任何
其他应用程序或更改设置
该服务被设置为前台服务。这就阻止了Android
从杀死我们的服务。按下停止按钮以停用信息亭
模式
似乎也有一个。您可以自定义此选项(禁用菜单访问、限制应用程序添加等)以启用kiosk 在搜索了一段时间后,我找到了一个很好的解决方案。不过,这只适用于根设备,但我想,如果只适用于这一个应用程序,那么根设备应该不会有问题
- 通过添加
<category android:name="android.intent.category.HOME" />
到你的目的过滤器
- 确保您的应用程序折叠工具栏,使您无法访问通知栏,请参见或
- 然后,要阻止任何其他程序错误地打开,请使用辅助功能服务检查窗口状态是否已更改,将包与白名单或黑名单进行比较,如果不应该运行,请使用ActivityManager.KillBackgroundProcess进行终止
另外,在谷歌发布的新安卓L预览版中,也可以找到另一种方式,它正是这样做的。然而,它似乎确实需要根
L Developer预览引入了一个新的任务锁定API,该API允许
您暂时限制用户离开您的应用程序或被拒绝
被通知打断。例如,如果您
正在开发一款支持高风险评估的教育应用程序
对Android的要求。一旦应用程序激活此模式,用户将
无法查看通知、访问其他应用或返回到
主屏幕,直到您的应用程序退出该模式
为防止未经授权的使用,只有授权的应用程序才能激活任务
锁定。此外,任务锁定授权必须由
特别配置的设备所有者应用程序,通过
android.app.admin.DevicePolicyManager.setLockTaskComponents()
method
要设置设备所有者,请执行以下步骤:
- 将运行安卓
userdebug
build的设备附加到您的开发中
机器李>
- 安装设备所有者应用程序李>
- 创建一个
device\u owner.xml
文件
并将其保存到设备上的/data/system
目录中李>
$adb root
$adb外壳止动器
$rm/tmp/device_owner.xml
$echo”“>>/tmp/device_owner.xml
$echo“&device owner package=\“\”name=\“*\”/>“>>/tmp/device\u owner.xml
$adb push/tmp/device_owner.xml/data/system/device_owner.xml
$adb重新启动
在应用程序中使用任务锁定API之前,请验证
通过调用来授权活动
DevicePolicyManager.IsLockTaskAllowed()
要激活任务锁定,请调用android.app.Activity.startocktask()
从您授权的活动中删除
当任务锁定处于活动状态时,以下行为将生效:
- 状态栏为空,显示用户通知和状态信息
是隐藏的李>
- “主页”和“最近使用的应用”按钮被隐藏李>
- 其他应用程序可能会
不开展新的活动李>
- 当前应用可能会启动新活动,
只要这样做不会创建新任务李>
- 用户仍处于锁定状态
在您的应用程序上,直到授权活动调用
Activity.stopLockTask()
Xposed框架可以做到这一点。它需要root,并且有可能无法在所有平台上运行。在类android.app.StatusBarManager中查找disable()方法
请看下面如何编写您自己的模块:
乍一看,这比你想象的要容易得多。祝你好运 除了使用引导接收器设置应用程序外,为了防止状态栏扩展,此解决方案在4.4及更高版本上作为一个完整的kiosk应用程序运行:
在onCreate()中放置:
这将完全隐藏后退按钮、应用程序和主页按钮。
Sub Activity_Pause (UserClosed As Boolean)
If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)
End Sub
<category android:name="android.intent.category.HOME" />
$ 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
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);
}
}
});
}
<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>
startLockTask
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 shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
@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();
}
• Whitelisting the applications
▪ Start lock task mode