Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的Kiosk模式_Android_Kiosk_Kiosk Mode - Fatal编程技术网

Android中的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,

我正在评估是否以及如何将CF.NET企业应用程序移植到Android设备上运行。Windows Mobile phones上的应用程序在kiosk模式下运行,在该模式下,应用程序在启动后以全屏模式自动启动,用户无法意外或自愿访问手机的任何其他部分


在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