Eri*_*rik 110 android kiosk kiosk-mode
我正在评估是否以及如何移植CF .NET企业应用程序以在Android设备上运行.Windows Mobile手机上的应用程序以kiosk模式运行,其中应用程序在启动后以全屏模式自动启动,并且用户无法意外或自愿访问手机的任何其他部分.
Android上是否可以在启动后只有一个应用程序自动启动,并防止用户意外(或自愿)访问Android设备的任何其他部分?
Val*_*tin 27
您可以通过android.intent.action.BOOT_COMPLETED在BroadcastReceiver中监听intent并从那里启动Activity 来自动启动应用程序.在活动中,您可以将自己注册为新的默认主屏幕[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>
Run Code Online (Sandbox Code Playgroud)
rbo*_*bot 17
您可以自定义此功能(禁用对菜单的访问,限制应用程序添加等)以启用自助服务终端.http://code.google.com/p/android-launcher-plus/
nha*_*man 17
在新的Android L Preview中,谷歌已经宣布了Task Locking,它就是这样做的.但它似乎确实需要root.
L Developer Preview引入了一个新的任务锁定API,可让您临时限制用户离开您的应用或被通知中断.例如,如果您正在开发教育应用程序以支持Android上的高风险评估要求,则可以使用此功能.一旦您的应用激活此模式,用户将无法看到通知,访问其他应用或返回主屏幕,直到您的应用退出该模式.
为防止未经授权的使用,只有授权的应用才能激活任务锁定 此外,任务锁定授权必须由特殊配置的设备所有者应用程序通过该
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
Run Code Online (Sandbox Code Playgroud)
在应用程序中使用任务锁定API之前,请通过调用DevicePolicyManager.isLockTaskPermitted()来验证您的活动是否已获得授权.
要激活任务锁定,请
android.app.Activity.startLockTask()从授权活动中致电.当任务锁定处于活动状态时,以下行为将生效:
- 状态栏为空白,隐藏用户通知和状态信息.
- 主页和最近的应用程序按钮被隐藏.
- 其他应用可能无法启动新活动.
- 当前应用程序可能会启动新活动,只要这样做不会创建新任务.
- 在授权活动呼叫之前,用户将保持锁定在您的应用上
Activity.stopLockTask().
经过一段时间的搜索,我找到了一个很好的解决方案.这只适用于root设备,但我想如果只是这个应用程序,那么生根应该不是问题.
通过添加使您的应用程序成为启动器
<category android:name="android.intent.category.HOME" />
Run Code Online (Sandbox Code Playgroud)
你的意图过滤器
确保您的应用程序折叠工具栏,以便您无法访问通知栏,请参阅如何以编程方式在Android上禁用状态栏/通知栏?或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/另一种方式
小智 5
实现此目的的最佳方法是将您的应用设置为启动器
<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>
Run Code Online (Sandbox Code Playgroud)
最可靠的方法是使用 Lollipop 或更高版本的设备并利用
startLockTask
Run Code Online (Sandbox Code Playgroud)
首先,您必须将您的应用设置为设备所有者。注意你的设备必须是未配置的:如果你注册了它,你应该恢复出厂设置并跳过帐户注册。
为了能够注册您的应用程序,您必须首先设置一个 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!
}
}
Run Code Online (Sandbox Code Playgroud)
一旦你有一个未配置的设备,你可以从 adb 启动以下命令(不需要 root)
adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver
Run Code Online (Sandbox Code Playgroud)
为避免 android 要求用户权限来固定您的应用程序,您必须调用 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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86973 次 |
| 最近记录: |