Android 以编程方式固定第三方应用程序的屏幕
在获得设备所有权之后,我尝试实现一种方法,指示设备将任何给定的应用程序锁定到kiosk模式(或屏幕锁定模式)。由于我拥有设备所有权,因此不会要求用户获得这样做的权限 从开发者网站上,简短的描述告诉我可以做我正在尝试的事情: 编程方式:要以编程方式激活屏幕固定,请调用 应用程序中的startLockTask()。如果请求的应用程序不是设备 所有者,则提示用户进行确认设备所有者应用程序可以 调用setLockTaskPackages()方法以使应用程序可锁定 没有用户确认步骤。 这表明作为设备所有者应用,我可以在没有用户确认的情况下锁定其他应用。。。但我不知道该怎么做 我已经能够将自己的应用程序置于固定模式Android 以编程方式固定第三方应用程序的屏幕,android,android-5.0-lollipop,device-policy-manager,device-owner,android-screen-pinning,Android,Android 5.0 Lollipop,Device Policy Manager,Device Owner,Android Screen Pinning,在获得设备所有权之后,我尝试实现一种方法,指示设备将任何给定的应用程序锁定到kiosk模式(或屏幕锁定模式)。由于我拥有设备所有权,因此不会要求用户获得这样做的权限 从开发者网站上,简短的描述告诉我可以做我正在尝试的事情: 编程方式:要以编程方式激活屏幕固定,请调用 应用程序中的startLockTask()。如果请求的应用程序不是设备 所有者,则提示用户进行确认设备所有者应用程序可以 调用setLockTaskPackages()方法以使应用程序可锁定 没有用户确认步骤。 这表明作为设备所有
如果您有任何帮助,我们将不胜感激。这里有一段代码片段,可以帮助您:
DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);
if (myDevicePolicyManager.isDeviceOwnerApp(this.getPackageName())) {
// Device owner
String[] packages = {this.getPackageName()};
myDevicePolicyManager.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
// Not a device owner - prompt user or show error
}
if (myDevicePolicyManager.isLockTaskPermitted(this.getPackageName())) {
// Lock allowed
startLockTask();
} else {
// Lock not allowed - show error or something useful here
}
setLockTaskPackages()
用于指定哪些应用程序(通过其包名)可以通过编程方式固定,而无需用户确认。
setLockTaskPackages()
是从您的设备所有者应用程序调用的(很可能是在您的DeviceAdminReceiver
的oneEnabled()
方法中)
因此,在您的owner设备应用程序中,您将有如下内容:
mDPM.setLockTaskPackages("com.foo.myapp");
然后,在您的“com.foo.myapp”应用程序中,您将被自动调整为调用:
startLockTask();
您的应用程序将立即进入锁定模式,无需任何用户确认
如果您没有首先向setLockTaskPackages
注册您的应用程序,应用程序将被锁定,但用户必须首先确认
还请注意,当应用程序使用setLockTaskPackages()
注册时,它具有一些与手动pin不同的行为:
- 用户无法通过长按Back+最近的应用程序手动取消绑定应用程序。您必须使用
stopLockTask()
以编程方式解除应用程序的锁定李>
- “主页”和“最近的应用”按钮不可见(不显示)
- 当应用程序解除锁定(通过stopLockTask())时,用户将直接返回主页:即使设置了键盘锁(模式、代码或任何键盘锁屏幕),也不会显示屏幕锁李>
我没有足够的声誉发表评论,我只想指出,对于带有物理按钮的设备(如@主席提到的三星Galaxy Tab a),管理应用程序强制取消钉扎的一种方法是在DeviceAdminReceiver类中实现以下内容:
@重写公共void onLockTaskModeExiting(上下文、意图
(意图)
因此,如果您的用户想要取消锁定,您可以随时重新锁定您的应用;) 这样我们只能锁定自己的应用程序,但正如kash解释的,他想锁定其他应用程序,是否可以使用具有设备所有者权限的DevicePolicyManager?是否可以从我们的应用程序锁定其他应用程序。正如我们所知,主页和最近的按钮将不可见。那么,如何才能连接到其他应用程序来锁定它。基本上,要求能够在kiosk/pinted模式下为多个应用程序使用设备。@khubaib您基本上需要在设备所有者中添加应用程序的包名。然后从应用程序中调用startLockTask()。这是我到目前为止找到的唯一方法。在哪里可以找到DeviceAdminSample.class?您要锁定的应用是您的还是第三方应用?@Hartok,我要锁定的应用是第三方应用。我们可以使用setLockTaskPackages方法锁定其他应用吗?@FlorentDupont,您提供的应用程序(例如com.foo.myapp)是否必须是您发布的应用程序,并且必须授权屏幕固定?愤怒的小鸟说,是不是我可以锁起来。。。com.rovio.angrybirds?@suniljain:不,你不能用setLockTaskPackages锁定另一个应用程序。您必须使用其他应用程序的Activity.startocktask()
来执行此操作@是的,在这个例子中,com.foo.myapp
必须由我发布。你不能以编程方式锁定另一个你不拥有的应用程序。我就这个问题写了一篇完整的文章。此处提供:。我希望它能回答你的问题。@FlorentDupont我写了一个拥有者和管理员的应用程序,我可以在没有用户确认的情况下成功锁定该应用程序,但用户仍然能够取消锁定该应用程序长时间按后退+最近的应用程序,按钮仍然存在,因为它们是物理按钮,我的设备是三星Galaxy Tab a。可能是三星的错误实现。